var
声明的变量在函数作用域里面会提升至顶部,在全局作用域里面会挂载到 window
对象上面。
var foo = 123 console.log(window.foo) // 123 ;(() => { console.log(bar) // undefined var bar = 456 })()
然而 let
,const
定义的变量却无法提前读取到,还会提示致命的引用错误。
(() => { console.log(typeof foo) // Uncaught ReferenceError: Cannot access 'foo' before initialization let foo = 123 })()
这是因为 JavaScript 在扫描代码时发现 let
,const
声明的代码会把它们放到暂时性死区 / 临时死区 / TDZ(temporal dead zone)中,只能在执行这部分声明代码后,这些变量从 TDZ 中移出,才能访问这些变量,不然就会报错。