JavaScript中let与const声明的变量存储在何处?
关于let/const声明的全局变量存储位置的解答
嘿,这个问题问得太到位了!我刚学ES6的时候也对着这个差异挠过脑袋,咱们一步步拆解清楚:
首先先确认你观察到的现象完全正确:
- 用
var声明的全局变量,确实会成为window对象的属性,比如:var foo = "foobar"; console.log(window.foo === foo); // 输出 true - 但用
let或const声明的全局变量,就不会挂载到window上:let foo = "foobar"; console.log(window.foo === foo); // 输出 false,因为window.foo是undefined
那这些let/const的全局变量到底存在哪呢?
其实它们存储在**全局执行上下文的词法环境(Lexical Environment)**中,和var的存储位置是分开的:
var声明的变量会被放在全局执行上下文的「变量环境(Variable Environment)」里,并且会被自动添加到全局对象(浏览器环境下就是window)中,这是ES5及之前的设计。- 而
let/const是ES6新增的声明方式,它们会被放在全局执行上下文的「词法环境」的环境记录中,这个环境记录和全局对象是相互独立的,不会把变量挂载到window上。
这么设计的原因也很实用:
- 避免全局变量污染
window对象:比如之前用var alert = 123会直接覆盖window.alert这个原生函数,导致没法正常弹出提示框;但用let alert = 123的话,只是在全局作用域里创建了一个alert变量,不会影响window.alert的正常使用。 - 更严格的作用域控制:配合块级作用域的特性,让全局变量的管理更安全,减少意外的变量覆盖问题。
你可以在浏览器控制台里做个小测试:声明let test = 'hello'后,直接输入test能拿到值,但输入window.test会得到undefined,这就直观证明了它在全局作用域,但不属于window的属性。
内容的提问来源于stack exchange,提问作者Elharony
相关产品推荐
相关产品推荐

