严格模式下默认绑定使this变为undefined,杜绝了函数独立调用时意外污染全局对象、静默失败和隐式状态泄露;非严格模式下this默认指向全局对象,易导致隐蔽错误。

默认绑定规则在严格模式下的变化,直接暴露了 JavaScript 原有执行机制中一个关键的安全缺口:函数独立调用时 this 的不确定性。而严格模式正是通过“切断默认绑定到全局对象”这一动作,从根源上堵住意外污染全局、静默失败和隐式状态泄露的漏洞。
默认绑定在非严格模式下的危险表现
当一个普通函数被直接调用(如 foo()),且未通过对象属性、call/apply 或 new 等方式显式指定上下文时,就触发默认绑定。非严格模式下:
- this 会无声无息地指向
window(浏览器)或global(Node.js) - 若函数内部给
this.xxx = val赋值,等于直接往全局对象挂属性 - 这种赋值不会报错,但可能覆盖已有全局变量、干扰其他模块,极难排查
严格模式如何用“undefined”重定义安全边界
启用 "use strict" 后,同样的独立调用 foo() 中,this 不再是全局对象,而是 undefined。这意味着:
- 任何试图通过
this修改全局状态的操作(如this.name = 'test')会立即抛出TypeError - 函数内部对
this的误用(比如忘记用new调用构造函数)不再悄悄失败,而是明确中断执行 - 它迫使开发者显式声明意图:需要全局访问?用
window.xxx;需要绑定对象?用obj.method()或func.call(obj)
与隐式/显式绑定形成协同防护
默认绑定本就是优先级最低的规则。严格模式并未改变绑定顺序,而是让“兜底行为”失效,倒逼更高优先级的绑定被主动采用:
- 想让函数操作某个对象?必须走隐式绑定(
obj.fn())或显式绑定(fn.call(obj)) - 想创建实例?必须用
new—— 此时 new 绑定生效,this指向新对象,与默认绑定无关 - 箭头函数不参与 this 绑定,它继承外层作用域的
this,因此也天然规避了默认绑定风险
实际编码中可观察的安全收益
下面两段代码在非严格与严格模式下行为截然不同:
非严格模式(危险):function setGlobal() {
this.version = '1.0'; // 静默挂到 window.version
}
setGlobal(); // 执行成功,但污染全局
console.log(window.version); // '1.0'
严格模式(安全):
"use strict";
function setGlobal() {
this.version = '1.0'; // TypeError: Cannot set property 'version' of undefined
}
setGlobal(); // 报错,阻止错误扩散
这不是限制能力,而是把“侥幸运行”变成“即时反馈”,让潜在 bug 在开发阶段就浮出水面。

















