وضع جافا سكريبت الصارم

Strict Mode هي ميزة ES5 ، وهي طريقة لجعل JavaScript يتصرف بطريقة أفضل. وبطريقة مختلفة ، حيث يؤدي تمكين Strict Mode إلى تغيير دلالات لغة JavaScript. من المهم حقًا معرفة الاختلافات الرئيسية بين كود JavaScript في الوضع المتشدد وجافا سكريبت العادي ، والذي يشار إليه غالبًا بالوضع القذر

الوضع الصارم هو ملفES5وهي طريقة لجعل JavaScript يتصرف في ملفطريقة افضل.

وفي أطريق مختلف، حيث يؤدي تمكين Strict Mode إلى تغيير دلالات لغة JavaScript.

من المهم حقًا معرفة الاختلافات الرئيسية بين شفرة JavaScript في الوضع المتشدد وجافا سكريبت "العادي" ، والتي غالبًا ما يشار إليها باسموضع قذرة.

يزيل Strict Mode في الغالب الوظائف التي كانت ممكنة في ES3 ، وتم إهمالها منذ ES5 (ولكن لم تتم إزالتها بسبب متطلبات التوافق العكسي)

كيفية تمكين الوضع الصارم

الوضع الصارم اختياري. كما هو الحال مع كل تغيير مفاجئ في JavaScript ، لا يمكننا تغيير الطريقة التي تتصرف بها اللغة افتراضيًا ، لأن ذلك قد يكسر أعدادًا كبيرة من JavaScript حولها ، ويبذل JavaScript الكثير من الجهد للتأكد من أن كود JavaScript لعام 1996 لا يزال يعمل حتى اليوم. إنه مفتاح نجاحها.

لذلك لدينا'use strict'التوجيه الذي نحتاج إلى استخدامه لتمكين الوضع الصارم.

يمكنك وضعه في بداية الملف ، لتطبيقه على جميع التعليمات البرمجية الموجودة في الملف:

'use strict'

const name = ‘Flavio’ const hello = () => ‘hey’

//…

يمكنك أيضًا تمكين Strict Mode لوظيفة فردية ، عن طريق وضع'use strict'في بداية عمل الجسم:

function hello() {
  'use strict'

return ‘hey’ }

يكون هذا مفيدًا عند العمل على التعليمات البرمجية القديمة ، حيث لا يتوفر لديك الوقت للاختبار أو الثقة لتمكين الوضع المتشدد على الملف بأكمله.

ما الذي يتغير في الوضع الصارم

المتغيرات العالمية العرضية

إذا قمت بتعيين قيمة لمتغير غير معروف ، فإن JavaScript بشكل افتراضي ينشئ هذا المتغير على الكائن العام:

;(function() {
  variable = 'hey'
})()(() => {
  name = 'Flavio'
})()

variable //‘hey’ name //‘Flavio’

عند تشغيل الوضع الصارم ، يظهر خطأ إذا حاولت القيام بما فعلناه أعلاه:

;(function() {
  'use strict'
  variable = 'hey'
})()(() => {
  'use strict'
  myname = 'Flavio'
})()

Variable not defined

أخطاء التعيين

JavaScript يفشل بصمت في بعض أخطاء التحويل.

في الوضع الصارم ، تثير هذه الأخطاء الصامتة الآن مشكلات:

const undefined = 1(() => {
  'use strict'
  undefined = 1
})()

الأمر نفسه ينطبق على Infinity و NaN وevalوargumentsو اكثر.

في JavaScript ، يمكنك تحديد خاصية كائن ما ليكون غير قابل للكتابة ، باستخدام

const car = {}
Object.defineProperty(car, 'color', { value: 'blue', writable: false })

في الوضع المقيد ، لا يمكنك تجاوز هذه القيمة ، بينما يكون ذلك ممكنًا في الوضع القذر:

يعمل نفس الشيء مع الحاصل على:

const car = {
  get color() {
    return 'blue'
  }
}
car.color = 'red'(
  //ok

  () => {
    'use strict'
    car.color = 'yellow' //TypeError: Cannot set property color of #<Object> which has only a getter
  }
)()

يسمح الوضع Sloppy بتمديد كائن غير قابل للتوسيع:

const car = { color: 'blue' }
Object.preventExtensions(car)
car.model = 'Fiesta'(
  //ok

  () => {
    'use strict'
    car.owner = 'Flavio' //TypeError: Cannot add property owner, object is not extensible
  }
)()

(نرىObject.preventExtensions())

أيضًا ، يسمح الوضع القذر بتعيين الخصائص على القيم الأولية ، دون الإخفاق ، ولكن أيضًا دون القيام بأي شيء على الإطلاق:

true.false = ''(
  //''
  1
).name =
  'xxx' //'xxx'
var test = 'test' //undefined
test.testing = true //true
test.testing //undefined

فشل الوضع الصارم في كل تلك الحالات:

;(() => {
  'use strict'
  true.false = ''(
    //TypeError: Cannot create property 'false' on boolean 'true'
    1
  ).name =
    'xxx' //TypeError: Cannot create property 'name' on number '1'
  'test'.testing = true //TypeError: Cannot create property 'testing' on string 'test'
})()

أخطاء الحذف

في الوضع القذر ، إذا حاولت حذف خاصية لا يمكنك حذفها ، فإن JavaScript ترجع خطأ ، بينما في Strict Mode ، فإنها تثير خطأ TypeError:

delete Object.prototype(
  //false

  () => {
    'use strict'
    delete Object.prototype //TypeError: Cannot delete property 'prototype' of function Object() { [native code] }
  }
)()

وسيطات دالة بنفس الاسم

في الوظائف العادية ، يمكن أن يكون لديك أسماء معلمات مكررة:

(function(a, a, b) {
  console.log(a, b)
})(1, 2, 3)
//2 3

(function(a, a, b) { ‘use strict’ console.log(a, b) })(1, 2, 3) //Uncaught SyntaxError: Duplicate parameter name not allowed in this context

لاحظ أن وظائف السهم ترفع دائمًا aSyntaxErrorفي هذه الحالة:

((a, a, b) => {
  console.log(a, b)
})(1, 2, 3)
//Uncaught SyntaxError: Duplicate parameter name not allowed in this context

بناء جملة ثماني

تم تعطيل بناء جملة Octal في Strict Mode. بشكل افتراضي ، يؤدي إعداد ملف0إلى رقم متوافق مع التنسيق الرقمي الثماني يجعله (أحيانًا مربكًا) يفسر على أنه رقم ثماني:

(() => {
  console.log(010)
})()
//8

(() => {
  'use strict'
  console.log(010)
})()
//Uncaught SyntaxError: Octal literals are not allowed in strict mode.

لا يزال بإمكانك تمكين الأرقام الثمانية في Strict Mode باستخدام ملف0oXXبناء الجملة:

;(() => {
  'use strict'
  console.log(0o10)
})()
//8

إزالةwith

يعطل Strict Mode ملفwithالكلمة الأساسية ، لإزالة بعض حالات الحافة والسماح بمزيد من التحسين على مستوى المترجم.


المزيد من دروس js: