什么是TDZ?

起因:http://weibo.com/1400854834/ErH6VjDgg?from=page_1005051400854834_profile&wvr=6&mod=weibotime&type=comment#_loginLayer_1485042085708
不赘述。

所以。。到底什么是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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,452评论 19 139
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 3,297评论 0 0
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 3,621评论 0 0
  • 官方中文版原文链接 感谢社区中各位的大力支持,译者再次奉上一点点福利:阿里云产品券,享受所有官网优惠,并抽取幸运大...
    HetfieldJoe阅读 4,099评论 2 2
  • 我是彼岸之上彼岸花, 梦醒看人世千年如沙。 你流连花下,转身那一刹, 天地间只剩你眉间朱砂。 十里春风不及你素手遮...
    时光梳阅读 1,755评论 2 4