在网上看到提的这样一个问题:

如下代码,我们都知道下面的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会被自动指向全局对象。