隐式绑定指函数作为对象属性被直接调用(如obj.fn())时,this自动绑定到该对象;触发需同时满足:函数是对象属性且调用时左侧为对象引用;赋值后调用会丢失绑定,导致this指向默认值。

JavaScript 中的“隐式绑定”是指函数作为对象的属性被调用时,this 自动绑定到该对象。这种绑定发生在 obj.method() 这类调用形式中,是分析 this 指向最常见也最容易误解的场景。
隐式绑定的触发条件
只有满足以下两个条件,才会发生隐式绑定:
- 函数必须作为对象的属性(即“方法”)被访问,比如
obj.fn; - 该函数必须**直接通过点号或方括号调用**,且调用时左侧是对象引用,例如
obj.fn()或obj['fn']()。
注意:一旦把方法赋值给变量或传入其他函数,就丢失了对象上下文,隐式绑定失效,this 会退回到默认绑定(非严格模式下为 window,严格模式下为 undefined)。
常见陷阱:赋值后调用导致 this 丢失
这是实际开发中最常出错的地方:
立即学习“Java免费学习笔记(深入)”;
const obj = {
name: 'Alice',
greet() {
console.log(`Hello, ${this.name}`);
}
};
obj.greet(); // ✅ Hello, Alice(隐式绑定生效,this → obj)
const sayHi = obj.greet;
sayHi(); // ❌ Hello, undefined(已脱离 obj,this 不再指向 obj)
解决方式包括:
- 调用时显式绑定:
sayHi.call(obj)或sayHi.bind(obj)(); - 使用箭头函数包装(箭头函数不绑定 this,沿用外层作用域);
- 在对象定义时用箭头函数(但注意:这会让方法无法访问 this,通常不推荐用于普通方法);
- ES6 类中用类字段语法 + 箭头函数自动绑定(React 常见)。
嵌套对象中的隐式绑定
隐式绑定只看**调用时紧邻的上层对象**,和定义位置无关:
const inner = { name: 'Bob' };
const outer = {
name: 'Tom',
inner,
greet() {
console.log(this.name); // ? 输出谁?取决于谁调用 greet
}
};
outer.greet(); // ✅ Tom(this → outer)
outer.inner.greet(); // ❌ 报错:inner.greet is not a function(inner 没有 greet)
// 正确示例:
outer.inner.greet = outer.greet;
outer.inner.greet(); // ✅ Bob(因为调用形式是 inner.greet(),this → inner)
关键点:this 永远由“哪个对象点出来的函数”决定,不是“函数在哪定义的”。
方括号访问也适用隐式绑定
只要调用形式是 obj['method']() 或 obj[expr](),且计算结果是对象上的函数属性,同样触发隐式绑定:
const obj = {
name: 'Charlie',
fn() { console.log(this.name); }
};
obj['fn'](); // ✅ Charlie
const key = 'fn';
obj[key](); // ✅ Charlie
但要注意:如果方括号里是表达式,而该表达式返回的不是对象本身的属性(比如返回了 undefined),则会报 “Cannot read property 'call' of undefined” 类型错误。


















