默认绑定触发条件是函数以独立方式调用,即直接写函数名加括号且无任何对象修饰;非严格模式下this指向全局对象,严格模式下为undefined。

函数调用时触发默认绑定规则,核心条件只有一个:函数以“独立函数调用”的方式执行,即调用时前面没有任何对象引用或修饰。它不看函数在哪定义、怎么声明,只看“怎么被调用”。
什么算“独立函数调用”?
就是直接写函数名加括号,没有点号(.)、没有方括号([])、没有 call/apply/bind、也没有 new:
-
foo()✅ 是默认绑定 -
obj.foo()❌ 不是,默认绑定被隐式绑定覆盖 -
foo.call(obj)❌ 不是,显式绑定生效 -
new Foo()❌ 不是,new 绑定生效 -
setTimeout(foo, 100)✅ 是——因为传入的是函数引用,实际执行时仍是foo() -
const f = obj.foo; f()✅ 是——虽然源自对象方法,但调用时已脱离上下文,变成独立调用
默认绑定的 this 指向取决于严格模式
这个细节必须注意,否则容易出错:
- 非严格模式下:
this指向全局对象(浏览器中是window,Node.js 中是globalThis) - 严格模式下:
this是undefined,访问属性会直接报错,比如this.a→TypeError - 严格模式的判定依据是函数执行时所处的环境,不是函数定义位置。哪怕函数在非严格代码里定义,只要在严格模式下调用,就按严格模式处理
常见意外触发场景
这些地方容易忽略,但其实都在走默认绑定:
- 事件回调中直接传方法:
btn.addEventListener('click', obj.handleClick)→ 点击时handleClick独立执行,this不再是obj - 作为参数传给其他函数:
doSomething(obj.fn),内部执行fn()就是默认绑定 - 定时器回调:
setTimeout(obj.method, 100),同理,执行时失去对象上下文 - 解构后调用:
const { method } = obj; method()→ 典型的隐式丢失
怎么验证是否触发了默认绑定?
最简单办法:在函数开头加一句 console.log(this),看输出是不是 window(非严格)或 undefined(严格)。如果不符合预期,基本可以断定发生了默认绑定,需要检查调用方式是否无意中切断了对象关联。


















