Javascript";这";回调是对象方法时的上下文
我有两个对象:myapp和dom。关于plunker的代码取自斯托扬·斯特凡诺夫(Stoyan Stefanov)的书《Javascript模式》(Javascript patterns) 书中说: 如果调用findNodes(myapp.paint),它将无法按预期工作,因为 将不定义此颜色。该对象将引用 全局对象,因为findNodes()是一个全局函数。如果 findNodes()是一个名为dom的对象的方法(如 findNodes()),则回调的这个内部将引用dom 而不是预期的myapp 在我的代码中,我希望得到红色,因为我调用对象方法dom.findNodes而不是全局函数。那么为什么我总是得到一个值为“紫色”的全局变量呢?谢谢 此功能: …不使用Javascript";这";回调是对象方法时的上下文,javascript,this,Javascript,This,我有两个对象:myapp和dom。关于plunker的代码取自斯托扬·斯特凡诺夫(Stoyan Stefanov)的书《Javascript模式》(Javascript patterns) 书中说: 如果调用findNodes(myapp.paint),它将无法按预期工作,因为 将不定义此颜色。该对象将引用 全局对象,因为findNodes()是一个全局函数。如果 findNodes()是一个名为dom的对象的方法(如 findNodes()),则回调的这个内部将引用dom 而不是预期的mya
此
,因此将其称为findNodes
或dom.findNodes
并不重要
您关心的此
如下所示:
当您调用myapp.paint()
,这是myapp
调用callback()
时,这是窗口(在浏览器中,当不处于严格模式时)。您可以像以下那样绑定“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);
现在已经有很多类似的问题了,其中一些问题有很好的答案。请四处看看。谢谢你的回复。但是下面的短语呢?如果findNodes()是名为dom的对象的方法(如dom.findNodes()),那么回调的内部将引用dom,而不是预期的myapp。这个问题是关于书籍的例子…@ааааааааааааааа。回调中this
的值完全取决于调用回调的方式。它不受调用回调函数的方式的影响。
myapp.paint = function (node) {
console.log(this.color);
};
dom.findNodes(myapp.paint.bind(this));
dom.findNodes = function ( callback, thisObject )
{
if (typeof callback === "function")
{
callback.call(thisObject);
}
}
dom.findNodes(myapp.paint, myapp);