var声明的全局变量会挂载到window对象,let声明的则不会;前者可通过window.x访问修改,后者仅存在于全局词法环境,window.x返回undefined。

在全局作用域下,var 声明的变量会自动成为 window 对象的属性,而 let 声明的变量不会。这是两者最直观、也最容易被忽略的差异之一。
var 全局变量会挂载到 window 上
用 var 在全局作用域(即不在任何函数或块内)声明变量,JavaScript 引擎会把它作为 window 的一个可枚举属性添加进去:
var name = "Alice"; console.log(window.name); // "Alice"- 可以直接通过
window.name或name访问,两者等价 - 还能被动态修改:
window.name = "Bob"; console.log(name); // "Bob"
let 全局变量不挂载到 window 上
用 let(或 const)在全局作用域声明的变量,虽然也是全局变量,但不会出现在 window 对象上:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
let age = 25; console.log(window.age); // undefined-
console.log(age); // 25—— 变量本身存在,只是不挂载 - 它属于“全局词法环境”的一部分,但和
window属性解耦了
为什么这个区别重要
实际开发中容易踩坑:
- 旧代码依赖
window.xxx检测某个库是否加载,如果该库用let声明全局标识符,检测就会失效 - 调试时误以为所有全局变量都能通过
window查看,结果找不到let声明的变量 - 某些 polyfill 或沙箱环境会遍历
window属性做隔离,let声明的变量天然绕过这类机制
补充说明:不是“不能访问”,而是“不挂载”
别混淆概念:let 声明的全局变量依然能直接使用(如 console.log(age)),只是它不属于 window 的自有属性。它存在于全局作用域,但不暴露为 window 的键值对 —— 这是 ES6 明确设计的行为,旨在减少全局污染和命名冲突。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










