ECMAScript6 暂时性死区 / 临时死区 / TDZ

var 声明的变量在函数作用域里面会提升至顶部,在全局作用域里面会挂载到 window 对象上面。

var foo = 123
console.log(window.foo) // 123

;(() => {
  console.log(bar) // undefined
  var bar = 456
})()

然而 letconst 定义的变量却无法提前读取到,还会提示致命的引用错误。

(() => {
  console.log(typeof foo) // Uncaught ReferenceError: Cannot access 'foo' before initialization
  let foo = 123
})()

这是因为 JavaScript 在扫描代码时发现 letconst 声明的代码会把它们放到暂时性死区 / 临时死区 / TDZ(temporal dead zone)中,只能在执行这部分声明代码后,这些变量从 TDZ 中移出,才能访问这些变量,不然就会报错。

发表评论

您的电子邮箱地址不会被公开。