所以。。到底什么是TDZ?
TDZ 是 Temporal Dead Zone 的缩写,翻译过来就是时间死区。
什么是时间死区呢?
我的理解就是一个变量,从定义到被赋值的中间这段时间就成为时间死区。如果你的console.log是在时间死区里,那么就会报错。
console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
上述代码中,在aLet 被复制 10 之前,就被称为时间死区。
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
那么问题来了,如果我的代码写成下面这样.
var a = 1
function test(a=a){
console.log(a)
}
test()
居然报错了。。。
这是如果参数存在默认值,那就出现了第三种作用域parameters environment(参数作用域)。
在上述代码中的参数作用域中,a=a 相当于 let a =a ,他会去找自己内部定义的a的值,但是这时候a还处于TDZ中,所以会报出 a is not defined 的错误。
那么参数作用域可以访问函数作用域么?
function test(a = b){
var b =1
console.log(a)
}
test()
又报出了b is not defined的错误。
说明参数作用域既访问不了全局作用域,也访问不了函数作用域。
引用:
http://www.jianshu.com/p/ebc51ce05416
https://github.com/ruanyf/es6tutorial/blob/eb2a62215a7bc4f73ac08ac29a90a248a48193ea/docs/function.md
http://code.wileam.com/default-value-n-params-env/
http://jsrocks.org/2015/01/temporal-dead-zone-tdz-demystified/
网友评论