防止全局污染导致 this 指向 window,核心是启用严格模式使 this 为 undefined、避免普通函数顶层调用、用 iife 或 esm 隔离作用域,并禁用 with/eval;未声明变量赋值和顶层函数调用将立即报错,而非静默挂载到 window。

防止全局污染导致 this 指向 window,核心是切断“未声明变量赋值”和“普通函数顶层调用”这两条通向全局对象的路径。关键不在绕开 window,而在于让错误提前暴露、让上下文明确可控。
启用严格模式,让 this 保持 undefined
非严格模式下,普通函数直接调用时 this 自动绑定到 window(浏览器)或 global(Node.js),容易引发静默污染。严格模式强制 this 在无明确调用对象时为 undefined,任何对 this.xxx 的赋值都会立即报错:
- 脚本顶部加
"use strict";,整段脚本生效 - 函数体开头加
"use strict";,只约束该函数 - ESM 模块(
.mjs或<script type="module"></script>)默认启用,无需手动写
避免普通函数顶层调用,改用箭头函数或显式绑定
顶层调用普通函数是 this 指向 window 的高发场景。可通过以下方式规避:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 用箭头函数替代:它不绑定自己的
this,而是继承外层作用域——在 ESM 或严格 IIFE 中,外层this是undefined,访问this.xxx就会立刻报错,而不是悄悄写到window - 函数调用时显式绑定:
fn.call(obj)、fn.bind(obj)或obj.fn(),确保this意图清晰 - 构造函数务必用
new:否则this会落到全局,严格模式下直接报错,提前拦截
封装执行环境,隔离顶层作用域
不让代码运行在真正的全局上下文中,就能从根本上杜绝 this === window 的意外发生:
- 用 IIFE 包裹:
(function() { "use strict"; /* 你的代码 */ })();,内部this默认为undefined(严格模式下) - 优先使用 ESM 模块:模块顶层的
this是undefined,且var不挂全局,let/const天然块级作用域 - 避免
with和eval:它们被严格模式禁止,防止动态作用域绕过控制
检查常见污染入口,主动防御
有些写法看似无害,实则悄悄把属性挂到了 window 上:
-
user.name = "Tom"(user未声明)→ 严格模式报ReferenceError,而非创建window.user -
this.token = "abc"(在非严格普通函数中顶层调用)→ 实际执行window.token = "abc" - 事件回调用普通函数:
btn.addEventListener("click", handler),若handler内部依赖this且未绑定,可能误操作window
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










