严格模式下函数普通调用时this为undefined;须将"use strict"置于函数体首行可执行语句前;仅影响当前及嵌套函数;显式绑定、对象方法、new、箭头函数等场景this不变。

函数定义中启用严格模式,会直接改变该函数内部 this 的默认行为:普通调用时,this 不再指向全局对象(如 window),而是变成 undefined。这是最核心、最易踩坑的变化。
函数内启用严格模式的方式
必须把 "use strict" 放在函数体的**第一行可执行语句之前**,包括注释和空行之后也不行。它只影响当前函数及其内部嵌套函数,不影响外层或调用它的代码。
- ✅ 正确:
function foo() { "use strict"; console.log(this); } - ❌ 无效:
function foo() { console.log(1); "use strict"; }(已执行语句后声明,不生效) - ✅ 嵌套也受控:
function outer() { "use strict"; function inner() { console.log(this); } inner(); }→ inner 中的 this 也是 undefined
严格模式下函数调用时的 this 表现
只要函数本身启用了严格模式,无论在哪调用,只要不属于显式绑定场景(如 obj.method()、call/apply、new、箭头函数),其内部 this 就是 undefined。
- 直接调用:
foo()→this === undefined - 间接调用但未传 context:
foo.call(null)或foo.apply(undefined)→ 仍为undefined(非严格模式下会被自动转成全局对象) - 定时器回调:
setTimeout(foo, 100)→this === undefined(注意:这和全局脚本级严格模式无关,只看 foo 自身是否启用)
不受影响的 this 场景
严格模式不会改变以下情况的 this 指向逻辑,它们保持与非严格模式一致:
- 对象方法调用:
obj.bar()→this仍指向obj - 构造函数调用:
new Foo()→this仍指向新创建的实例 - 显式绑定:
foo.call(obj)、foo.bind(obj)()→this仍按传入值确定 - 箭头函数:
() => console.log(this)→ 无独立 this,始终继承外层词法作用域的 this(若外层是严格模式下的普通函数,则继承的是 undefined)
为什么这个变化很重要
把 this 设为 undefined 而不是 window,本质上是一种“失败快速”设计:它让隐式依赖全局对象的错误代码立即报错(如 this.a = 1 抛出 TypeError),而不是悄悄污染全局命名空间。这对模块化开发、避免意外副作用、提升调试效率非常关键。


















