在 JavaScript 中,this
的绑定方式是一个关键概念,它决定了函数执行时 this
的值。this
的绑定方式可以分为四种:默认绑定、隐式绑定、显式绑定和 new
绑定。
1. 默认绑定
当函数独立调用时(即不是某个对象的方法,也不是构造函数),this
默认指向全局对象。在浏览器中,全局对象是 window
。
function foo() {
console.log(this.a);
}
var a = 2;
foo(); // 输出:2,因为 this 默认指向 window
2. 隐式绑定
当函数作为某个对象的方法被调用时,this
会隐式地绑定到该对象上。
function foo() {
console.log(this.a);
}
var obj = {
a: 3,
foo: foo
};
obj.foo(); // 输出:3,因为 this 隐式绑定到 obj 上
3. 显式绑定
通过 Function.prototype.call
、Function.prototype.apply
或 Function.prototype.bind
方法,我们可以显式地设置函数执行时的 this
值。
function foo() {
console.log(this.a);
}
var obj = { a: 4 };
foo.call(obj); // 输出:4,因为 this 被显式绑定到 obj 上
4. new 绑定
当函数作为构造函数用 new
关键字调用时,this
会绑定到新创建的对象上。
function Foo(a) {
this.a = a;
this.bar = function() {
console.log(this.a);
}
}
var instance = new Foo(5);
instance.bar(); // 输出:5,因为 this 绑定到新创建的对象 instance 上
总结:
- 默认绑定:函数独立调用时,
this
默认指向全局对象(在浏览器中是window
)。 - 隐式绑定:函数作为对象的方法被调用时,
this
隐式地绑定到该对象上。 - 显式绑定:通过
call
、apply
或bind
方法显式地设置函数执行时的this
值。 - new 绑定:函数作为构造函数用
new
关键字调用时,this
绑定到新创建的对象上。