javascript - ما هي المنطقة الميتة الزمنية؟




ecmascript-6 const (2)

لقد سمعت أن الوصول إلى قيم let و const قبل أن تتم تهيئتها يمكن أن يتسبب في ReferenceError بسبب شيء يسمى المنطقة الزمنية الميتة .

ما هي المنطقة الزمنية الميتة ، وكيف ترتبط بالنطاق والرفع ، وما هي المواقف التي تواجهها؟


في حالة متغيرات let و const ، في الأساس ، المنطقة الزمنية الميتة هي منطقة

"قبل إعلان المتغير" ،

أي حيث لا يمكنك الوصول إلى قيمة هذه المتغيرات ، سوف يلقي خطأ.

السابق.

let sum = a + 5;        //---------
//some other code       //         | ------>  this is TDZ for variable a
                        //         |
console.log(sum)        //---------
let a = 5;

أعلاه رمز يعطي خطأ

لن يعطي الرمز نفسه خطأ عندما نستخدم var للمتغير 'a' ،

السابق.

var sum = a;                            
console.log(sum)     //prints undefined
var a = 5;

let و const لها اختلافات واسعة من var :

  1. هم كتلة النطاق .
  2. الوصول إلى var قبل التصريح به ، النتيجة undefined ؛ الوصول إلى let أو const قبل الإعلان عن رميات ReferenceError :

console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;

يبدو من هذه الأمثلة أنه قد لا يتم hoisted الإعلانات (و const ، والتي تعمل بنفس الطريقة) ، لأن aLet لا يبدو أنه موجود قبل أن يتم تعيين قيمة له.

هذا ليس هو الحال ، مع ذلك - let و const مرفوعين (مثل var ، class و function ) ، ولكن هناك فترة بين الدخول إلى النطاق والإعلان عن المكان الذي يتعذر الوصول إليه. هذه الفترة هي المنطقة الميتة الزمنية (TDZ) .

ينتهي TDZ عندما يتم الإعلان عن aLet بدلاً من aLet :

//console.log(aLet)  // would throw ReferenceError

let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10

يوضح هذا المثال أنه let نرفع:

let x = 'outer value';
(function() {
  // start TDZ for x
  console.log(x);
  let x = 'inner value'; // declaration ends TDZ for x
}());

الائتمان: الزمانية المنطقة الميتة (TDZ) الغموض

الوصول إلى x في النطاق الداخلي لا يزال يؤدي إلى ReferenceError . إذا لم يتم رفعها ، فستسجل outer value .

يعتبر TDZ أمرًا جيدًا لأنه يساعد على تمييز الأخطاء - نادرًا ما يكون الوصول إلى القيمة قبل إعلانها مقصودًا.

ينطبق TDZ أيضًا على وسيطات الوظيفة الافتراضية. يتم تقييم الوسائط من اليسار إلى اليمين ، وتكون كل وسيطة في TDZ حتى يتم تعيينها:

// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.

لا يتم تمكين TDZ بشكل افتراضي في محول الشفرة babel.js. قم بتشغيل وضع "التوافق العالي" لاستخدامه في REPL . قم es6.spec.blockScoping علامة es6.spec.blockScoping لاستخدامها مع CLI أو كمكتبة.

وأوصت بمزيد من القراءة: ألغيت TDZ و ES6 Let و Const و "المنطقة الميتة الزمنية" (TDZ) في العمق .







let