this的指向
this的指向与函数声明的位置没有关系,只与函数调用的位置有关。
this的绑定规则
- 默认绑定
- 隐式绑定
- 显式绑定
- new绑定
默认绑定
function func() {
console.log(this.a)
}
var a = 1
func() // 1
func函数是全局调用的,所以func中的this指向的是全局对象。 func是直接调用的,未带任何修饰调用的,因此只能使用默认绑定。
备注: 如果使用严格模式(strict mode),全局对象就无法默认绑定,this就会绑定到undefined上。
隐式绑定
需要考虑的规则是调用位置是否有上下文对象,或者说是否被某个对象拥有或者包含
function foo() {
console.log( this.a );
}
var obj = {
a: 2,
foo: foo
};
obj.foo(); // 2
对象属性链中只有最顶层或最后一层影响调用位置
function foo() {
console.log( this.a );
}
var obj2 = {
a: 42,
foo: foo
};
var obj1 = {
a: 2,
obj2: obj2
};
obj1.obj2.foo(); // 42
显式绑定
通过call、bind、apply进行显式绑定
new绑定
function foo(a) {
this.a = a;
}
var bar = new foo(2);
console.log( bar.a ); // 2
通过new调用foo()的时候,会创建一个新的对象,foo中this就会指向这个新创建的对象。
绑定优先级
new绑定 > 显式绑定 > 隐式绑定 > 默认绑定