Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/465.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";这";回调是对象方法时的上下文_Javascript_This - Fatal编程技术网

Javascript";这";回调是对象方法时的上下文

Javascript";这";回调是对象方法时的上下文,javascript,this,Javascript,This,我有两个对象:myapp和dom。关于plunker的代码取自斯托扬·斯特凡诺夫(Stoyan Stefanov)的书《Javascript模式》(Javascript patterns) 书中说: 如果调用findNodes(myapp.paint),它将无法按预期工作,因为 将不定义此颜色。该对象将引用 全局对象,因为findNodes()是一个全局函数。如果 findNodes()是一个名为dom的对象的方法(如 findNodes()),则回调的这个内部将引用dom 而不是预期的mya

我有两个对象:myapp和dom。关于plunker的代码取自斯托扬·斯特凡诺夫(Stoyan Stefanov)的书《Javascript模式》(Javascript patterns)

书中说:

如果调用findNodes(myapp.paint),它将无法按预期工作,因为 将不定义此颜色。该对象将引用 全局对象,因为findNodes()是一个全局函数。如果 findNodes()是一个名为dom的对象的方法(如 findNodes()),则回调的这个内部将引用dom 而不是预期的myapp

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

此功能:

…不使用
,因此将其称为
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);