严格模式下this为undefined是主动暴露问题的安全机制,能及时发现并阻断隐式全局写入;非严格模式下裸调用、方法提取误用等易污染全局;严格模式使非法赋值立即报错;es模块默认严格模式;应显式使用globalthis、避免依赖this隐式绑定,并建立防御性开发习惯。

严格模式下默认绑定让 this 变成 undefined,不是漏洞,而是设计用来“主动暴露问题”的安全机制。它本身不防污染,但能帮你及时发现并阻断隐式全局写入——这才是防范污染的关键。
识别哪些操作会意外污染全局
非严格模式下,裸调用函数时 this 指向 window 或 global,容易导致静默挂载属性:
-
function init() { this.config = { debug: true }; }→ 在非严格模式下执行后,window.config被创建 -
obj.method()被误写成const m = obj.method; m();→ 非严格模式下this是window,this.x = 1就成了window.x = 1 - 模块顶层直接写
this.api = fetch→ CommonJS 中可能挂到module.exports,但 ES 模块中若误用,非严格模式下可能意外落到全局
用 undefined 强制中断非法赋值
开启严格模式后,上述代码执行时会立即报错,而不是悄悄污染:
-
"use strict"; function init() { this.config = { debug: true }; } init();→ 报TypeError: Cannot set property 'config' of undefined - 错误在运行时立刻抛出,不会等到后续某处读取
window.config才出问题 - 所有模块文件(
.mjs或type="module")默认启用严格模式,天然具备该保护
配合显式意图明确上下文
不能只靠报错,还要把“想往哪写”说清楚:
- 真要挂载全局能力,显式使用
globalThis:globalThis.API = myApi; - 对象方法内部避免依赖
this写全局,改用参数或闭包:function createLogger(prefix) { return () => console.log(prefix); } - 类中初始化状态,统一在构造函数里声明:
this.state = {},而非靠this默认指向去“碰运气”
构建防御性开发习惯
把严格模式当作基础环境,再叠加主动控制:
- 项目入口加
"use strict"(ES 模块无需手动加,但 CommonJS 文件建议显式声明) - CI 流程中检查是否所有脚本都运行在严格模式下(可通过 AST 分析或 ESLint 规则
strict) - 对第三方库方法传入回调前,先确认其
this行为;不确定时,统一用箭头函数或.bind(this)封装











