默认绑定下,严格模式中this为undefined,非严格模式指向全局对象;触发场景包括直接调用、赋值后调用、未绑定回调及iife;严格模式使this访问报错,提升错误可见性。

默认绑定在严格模式下,this 值为 undefined;在非严格模式下,this 指向全局对象(浏览器中是 window,Node.js 中是 global)。这个差异直接影响函数内部对 this 的访问是否报错。
哪些调用会触发默认绑定
只要函数不是作为对象方法、构造函数、箭头函数,也没被 call/apply/bind 显式绑定,就属于默认绑定。典型场景包括:
- 直接调用:foo()
- 赋值后调用:const fn = obj.method; fn();
- 回调中未绑定:setTimeout(foo, 100) 或 [1,2].forEach(foo)
- 立即执行函数表达式(IIFE):(function(){})()
严格模式如何改变 this 行为
启用 "use strict" 后,普通函数调用时的 this 不再自动绑定到全局对象,而是保持为 undefined:
- 访问 this.a 或给 this.x = 1 赋值会直接抛出 TypeError
- 该规则只作用于当前作用域:可在整个脚本顶部声明,也可仅在单个函数内启用
- 箭头函数不受影响——它的 this 始终由外层词法作用域决定,与是否严格模式无关
非严格模式下的潜在风险
看似“安全”的写法可能掩盖问题:
- this 指向 window,意外修改 this.name 可能污染全局命名空间
- 未声明变量赋值(如 a = 1)会静默创建全局变量,引发隐蔽冲突
- 重复参数名或对象属性名不会报错,但逻辑可能不符合预期
现代开发普遍默认启用严格模式,ES6 模块和 class 语法也自动进入严格模式。建议主动添加 "use strict",让错误更早暴露。











