严格模式下普通函数独立调用时this为undefined,旨在防止全局对象污染;触发场景包括foo()、const f = foo; f()、setTimeout(foo, 100)等;可通过箭头函数、call/apply/bind或对象属性调用避免。

在JavaScript严格模式下,普通函数(非箭头函数、非对象方法、非构造函数调用)独立调用时,this 的值确实是 undefined,而不是默认绑定到全局对象(如浏览器中的 window 或 Node.js 中的 global)。
为什么严格模式下 this 是 undefined
这是严格模式的明确设计:禁止隐式绑定到全局对象,从而避免意外的全局变量污染和难以调试的行为。非严格模式下,顶层函数调用会把 this 设为全局对象,而严格模式将其设为 undefined,让错误更早暴露。
哪些调用方式会触发 this 为 undefined
- 直接调用函数:
foo() - 通过变量引用后调用:
const f = foo; f(); - 作为回调传入但未绑定上下文(如
setTimeout(foo, 100))
如何避免 this 为 undefined 导致错误
根据使用场景选择合适方式:
- 若需访问当前对象,改用箭头函数(它不绑定自己的
this,而是继承外层作用域的this) - 若必须是普通函数,调用时显式绑定:
foo.call(obj)、foo.apply(obj, [...])或foo.bind(obj)() - 若在对象方法中,确保以对象属性方式调用:
obj.method(),而非提取后调用 - 在事件监听器或回调中,使用
bind、箭头函数或类字段语法(handleClick = () => { ... })保持上下文
注意:例外情况仍然存在
this 为 undefined 仅适用于“普通函数调用”。以下情况不受影响:
立即学习“Java免费学习笔记(深入)”;
- 对象方法调用:
obj.fn()→this指向obj - 构造函数调用:
new Fn()→this指向新实例 - 箭头函数:本身不绑定
this,所以不会变成undefined,而是沿用外层词法作用域 - DOM 事件处理函数(如
element.addEventListener('click', fn)):调用时this指向触发元素,与严格模式无关


















