从 es2015 对变量声明的规定中,不难看到tdz的身影,所以什么是tdz?
在查询到的多个结果结合看来: 在let/const,使用函数默认变量时,未完全初始化前的区域,称为暂存死区。
在新增的关键字中,产生TDZ现象的是:
// let console.log(a); // throw Reference Error let a = 1; // const console.log(b); // throw Reference Error const b = 1;解释: 从 规范 中不难看出,js解释器在进行解释时,预检测到let/const,在本作用域解释流没有到let/const完全解释之前是不可以读/写该变量的。
作用: 存在即是合理,这样的报错,要求变量的声明尽量在作用域的头部,也方便了测试代码的编写,规范代码的格式。
未完全声明时的变量使用
let a = a ; // throw Reference Error: a is not define函数使用let/const变量
let a = fn(); // throw Reference Error: b is not define let b = 1; function fn () { return b }众所皆知,var/function 声明时存在变量提升的效果:
console.log(a); // undefined var a = 1; console.log(b); // function b () {} function b () {}而let / const 在问题1的示例中直接出现了reference error,那存在变量提升么?
解释这个问题,需要先思考下,什么是变量提升,由变量提升这个问题,会追溯到其来源, JS的生命周期,由这篇文章不难看到,let 在声明阶段时,其实没有和内存中的地址进行绑定,反而是在初始化的阶段,进行的绑定,所以不存在变量提升的情况。
函数默认变量
function fn (a = b, b) { ... } fn(1,2) // throw Reference Error: b is not define解释: 在使用函数默认变量时,近似于:
function fn () { let a = arguments[0]; let b = arguments[1]; } // 而上述的例子 可以解释为: function fn () { let a = b; let b = arguments[1]; }所以会出现TDZ的现象。
引用: 1. 我用了两个月的时间才理解 let 2. es规范 3. TEMPORAL DEAD ZONE (TDZ) DEMYSTIFIED 4. MDN