默认绑定下,非严格模式this指向全局对象(如window),严格模式为undefined;仅适用于直接调用(如foo())、无点号、new、call/apply/bind等干预的场景。

普通函数通过默认绑定确定 this 指向时,核心规则是:非严格模式下指向全局对象(浏览器中为 window),严格模式下为 undefined。前提是该函数必须是“直接调用”,即不通过任何对象属性、call/apply/bind 或箭头函数等方式干预调用方式。
什么是默认绑定
默认绑定发生在函数以最简单的方式被调用时,也就是没有明确的调用主体(即不带点号、不通过 new、不显式绑定):
-
foo()—— 典型默认绑定场景 -
(foo)()、(function(){})()、setTimeout(foo, 100)等也属于默认绑定 - 只要不是
obj.foo()(隐式绑定)、foo.call(obj)(显式绑定)或new foo()(new 绑定),就可能触发默认绑定
非严格模式 vs 严格模式的区别
默认绑定的行为取决于当前执行上下文是否处于严格模式:
- 非严格模式:
this指向全局对象(浏览器中是window,Node.js 中是global) - 严格模式:
this保持为undefined,不会被自动绑定到全局对象
this 就是 undefined,容易报错。
常见陷阱与验证方法
容易误判为隐式绑定,实则仍是默认绑定:
-
var obj = { fn: function() { console.log(this); } }; var bar = obj.fn; bar();—— 这里bar是对函数的引用赋值,调用时无上下文,属于默认绑定 function foo() { return this; } console.log(foo() === window); // true(非严格)- 可通过
console.log(this === globalThis)或console.log(this === undefined)快速验证当前绑定结果
如何避免默认绑定带来的问题
当需要固定 this 但又不想改调用方式时,可主动干预绑定:
- 使用
bind创建永久绑定函数:const boundFoo = foo.bind(obj); boundFoo(); - 用箭头函数包装(利用其不绑定
this的特性,继承外层this):const wrapper = () => foo(); - 在函数开头手动检查:
if (this === undefined) throw new Error("this is undefined in strict mode");
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











