在网上看到提的这样一个问题:
如下代码,我们都知道下面的this指向,一个是obj,一个在不是严格模式下,指向window,输出a,b,我想请问下,如何让person()也输出b?我一直想不通,这个this如何指向obj?
var fullname = 'a';
var obj = {
fullname: 'b',
getFullname: function() {
return this.fullname;
}
}
var person = obj.getFullname;
console.log(obj.getFullname()); // b
console.log(person()); // a
后文有人给出了解决方法:
var fullname = 'a';
var obj = {
fullname: 'b',
getFullname: function() {
return this.fullname;
}
}
var person = obj.getFullname;
console.log(obj.getFullname()); // b
console.log(person.call(obj)); // b
我们来延伸一下,为什么使用call就可以了呢?
搬出犀牛书第8.7.3节是这样说的,我们可以将call()看做是某个对象的方法,通过调用方法的形式来间接调用函数。call()的第一个实参是要调用函数的母对象,它是调用上下文,在函数体内通过this来获得对它的引用,要想以对象o的方法来调用函数f(),可以这样使用call():
f.call(o);
上面答案正是通过call()改变了调用的上下文,而this的指向,是在函数被调用的时候确定的,或者说执行上下文被创建的时候确定的。
aplly和bind也是一样的道理。上面提到到this指向问题。
this指向要注意的是,函数在什么时候被调用的,如果是作为一个对象的方法被调用,内部的this指向该对象,如果是单独调用,内部的this指向undefined,而在非严格模式中,this指向undefined会被自动指向全局对象。