我有两个对象: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而不是全局函数。那么为什么我总是得到一个值为“紫色”的全局变量?谢谢!
答案 0 :(得分:0)
此功能:
function (callback) { if (typeof callback === "function") { callback(); } }
...不使用this
因此,如果您将其称为findNodes
或dom.findNodes
,则无关紧要。
您关心的this
就在这里:
myapp.paint = function (node) { console.log(this.color); };
当您致电myapp.paint()
时,this
为myapp
。
当您致电callback()
时,this
为window
(在浏览器中,未处于严格模式时)。
答案 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);