默认绑定指函数独立调用时的this绑定规则:非严格模式下指向全局对象(window或global),严格模式下为undefined;核心取决于调用形式而非定义位置。

函数独立调用时的默认绑定,核心就看调用时有没有“上下文对象”。没有对象点号、没有 new、没有 call/apply/bind,就是默认绑定——它不看函数在哪定义,只看怎么被调用。
什么算“独立调用”?
只要调用形式是 纯函数名加括号,或等价形式,就触发默认绑定:
-
foo()—— 最典型,直接调用 -
const fn = obj.method; fn();—— 虽然源自对象,但赋值后脱离了对象,变成纯函数调用 -
(function(){})();或!function(){}();—— IIFE(立即执行函数),没有调用者对象 -
setTimeout(obj.method, 100)—— 回调被当作普通值传入,执行时无上下文
默认绑定的 this 值怎么确定?
取决于是否启用严格模式:
- 非严格模式下:
this指向全局对象(浏览器中是window,Node.js 中是global) - 严格模式下:
this是undefined
比如:
立即学习“Java免费学习笔记(深入)”;
function logThis() { console.log(this); }
logThis(); // 非严格:Window;严格:undefined
为什么容易出错?关键在“丢失上下文”
很多问题不是默认绑定本身难,而是你以为它还绑着对象,其实早已断开:
-
const handler = obj.handleClick; button.onclick = handler;→ 点击时是handler(),不是obj.handleClick() -
arr.map(obj.method)→ 每次调用都是独立执行,this不是obj - React 类组件中写
onClick={this.handleClick}而没绑定,事件触发时也是默认绑定
怎么验证当前是不是默认绑定?
最直接的方法:在函数开头加一句判断:
function checkBinding() {
if (this === window || this === globalThis) {
console.log('默认绑定(非严格)');
} else if (this === undefined) {
console.log('默认绑定(严格)');
} else {
console.log('不是默认绑定,this 指向', this);
}
}
配合 'use strict' 切换模式,能快速定位绑定类型。


















