复杂情况的this指向
复杂情况的this指向——是指当函数同时满足‘this指向谁’中所述的多个调用情况时,this指向谁?其实,更确切的讲,这主要取决于这些调用情况的优先级。因此本文主要讨论这些调用情况的优先级
开门见山吧!
- 优先级
构造器调用模式(new) > call/apply调用模式和bind硬绑定 > 方法调用模式 > 函数调用模式
- 示例
function foo() {
console.log( this.a );
}
var obj1 = {
a: 2,
foo: foo
};
var obj2 = {
a: 3,
foo: foo
};
obj1.foo(); // 2
obj2.foo(); // 3
obj1.foo.call( obj2 ); // 3,同时满足方法调用模式与call/apply调用模式
obj2.foo.call( obj1 ); // 2
function foo(something) {
this.a = something;
}
var obj1 = {
foo: foo
};
var obj2 = {};
obj1.foo( 2 );
console.log( obj1.a ); // 2
obj1.foo.call( obj2, 3 );
console.log( obj2.a ); // 3
var bar = new obj1.foo( 4 );//同时满足方法调用模式与new调用模式
console.log( obj1.a ); // 2
console.log( bar.a ); // 4
function foo(something) {
this.a = something;
}
var obj1 = {};
var bar = foo.bind( obj1 );
bar( 2 );
console.log( obj1.a ); // 2
var baz = new bar(3);
console.log( obj1.a ); // 2
console.log( baz.a ); // 3
bind绑定——其会返回一个硬编码的新函数
例外的绑定
如果你把null 或者undefined 作为this 的绑定对象传入call、apply 或者bind,这些值在调用时会被忽略,实际应用的是默认绑定规则:
function foo() {
console.log( this.a );
}
var a = 2;
foo.call( null ); // 2
ps:本文案参考了下列书籍
《你不知道的JavaScript》(上卷)