当回调是一个对象方法时,Javascript“this”上下文

时间:2015-09-30 10:11:26

标签: javascript this

我有两个对象:myapp和dom。关于plunker的代码是从Stoyan Stefanov的书“Javascript模式”中获得的(但有点简化)。

http://plnkr.co/edit/FutgitMBlnrYfBKuL0Ig?p=preview

var myapp = {};
var color = "purple";
myapp.color = "green";
var dom = {};
dom.color = "red";

myapp.paint = function (node) {
    console.log(this.color);
};


dom.findNodes = function (callback) {
    if (typeof callback === "function") {
        callback();
    }
}


dom.findNodes(myapp.paint);

根据这本书:

  

如果你调用findNodes(myapp.paint),它将无法按预期工作,因为   this.color将不会被定义。这将指的是对象   全局对象,因为findNodes()是一个全局函数。如果   findNodes()是一个名为dom的对象的方法(如   dom.findNodes()),然后这个回调内部将引用dom   而不是预期的myapp。

在我的代码中,我希望颜色为“红色”,因为我调用了对象方法dom.findNodes而不是全局函数。那么为什么我总是得到一个值为“紫色”的全局变量?谢谢!

2 个答案:

答案 0 :(得分:0)

此功能:

function (callback) {
    if (typeof callback === "function") {
        callback();
    }
}

...不使用this因此,如果您将其称为findNodesdom.findNodes,则无关紧要。

您关心的this就在这里:

myapp.paint = function (node) {
    console.log(this.color);
};

当您致电myapp.paint()时,thismyapp

当您致电callback()时,thiswindow(在浏览器中,未处于严格模式时)。

答案 1 :(得分:0)

您可以绑定“this”对象,如:

dom.findNodes(myapp.paint.bind(this));

或者假设这是一个参数并用它调用paint函数:

dom.findNodes = function ( callback, thisObject )
{
    if (typeof callback === "function")
    {
        callback.call(thisObject);
    }
}

dom.findNodes(myapp.paint, myapp);