隐式绑定发生于obj.method()调用时,this自动指向obj;前提为方法是obj属性且直接调用,若赋值或传参后调用则丢失绑定,需用bind、箭头函数等修复。

在 JavaScript 中,当通过实例对象调用原型上的方法时,this 会自动绑定为该实例对象 —— 这就是“隐式绑定”,不需要手动处理。
隐式绑定发生的前提条件
必须满足以下两个关键点,this 才能正确指向当前实例:
- 方法必须作为对象的属性被访问(即使用
.或[]语法) - 调用时必须是“直接调用”,不能赋值给变量后再调用,也不能通过其他方式间接调用
例如:
function Person(name) {
this.name = name;
}
Person.prototype.sayName = function() {
console.log(this.name); // this 指向调用它的实例
};
const alice = new Person('Alice');
alice.sayName(); // 输出 'Alice' → this 是 alice 实例
为什么原型方法能拿到正确的 this
因为函数本身不绑定 this,它只在**调用时**根据调用位置决定 this 值。当写 alice.sayName() 时:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- JS 引擎识别出
sayName是从alice上获取的(左侧有主语对象) - 于是把
alice作为 this 传入函数执行 - 这个规则对原型链上找到的方法同样适用 —— 只要调用形式是
obj.method(),就触发隐式绑定
容易破坏隐式绑定的常见写法
以下操作会让 this 失去指向实例的能力:
-
const fn = alice.sayName; fn();→ this 变成 undefined(严格模式)或全局对象 -
(alice.sayName)();→ 圆括号不改变调用主体,但某些场景下可能被误认为“无主语” -
setTimeout(alice.sayName, 100);→ 回调中 this 不再是 alice
修复方式:用 bind、箭头函数包裹、或改用 call/apply 显式传入。
和 class 方法行为一致
ES6 class 的实例方法底层也走同样的机制:
class Animal {
constructor(name) { this.name = name; }
speak() { console.log(this.name + ' speaks'); }
}
const dog = new Animal('Dog');
dog.speak(); // 'Dog speaks' → this 是 dog
class 只是语法糖,其方法仍定义在原型上,调用时依然依赖隐式绑定规则。

















