You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:17:37