let声明的变量不会挂载到window对象上,因此天然避免污染全局作用域;但显式赋值window、隐式全局及非模块脚本仍可能导致污染,应坚持用let/const、严格模式和模块化。

在浏览器环境中,let 声明的变量**不会挂载到 window 对象上**,这是它与 var 的关键区别之一。因此,只要正确使用 let(且不在全局作用域的顶层直接赋值覆盖),天然就能避免污染 window。
let 本身不绑定到 window
let(以及 const、class)声明具有块级作用域,且在全局作用域中声明时,**不会成为 window 的可枚举属性**:
let a = 1;
console.log(window.a); // undefined
console.log('a' in window); // false
而 var a = 1 则会让 window.a === 1,且 'a' in window 为 true。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
需警惕的“伪污染”场景
虽然 let 不自动挂载,但以下情况仍可能意外影响 window:
立即学习“Java免费学习笔记(深入)”;
-
显式赋值给
window:如window.myVar = 'hello'—— 这和声明方式无关,纯属主动挂载; -
函数内未声明直接赋值:如
function f() { x = 123; }(漏写let/const),此时x会作为隐式全局变量挂在window.x上; -
模块脚本(
type="module")中的顶层声明:模块有独立作用域,即使写let a = 1,也完全与window隔离,更安全。
最佳实践建议
- 始终用
let或const声明变量,禁用隐式全局; - 启用严格模式(
"use strict";),让隐式全局赋值直接报错; - 在 HTML 中使用
<script type="module">,天然获得模块作用域,彻底隔绝window污染; - 避免手动操作
window.xxx = ...,除非明确需要暴露给其他脚本。
本质上,let 不是“靠技巧避免污染”,而是语言设计上就切断了与全局对象的默认关联。关键在于坚持规范写法,不绕过声明机制。


















