Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.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 函数中的“this”在函数中的对象中_Javascript_Node.js - Fatal编程技术网

Javascript 函数中的“this”在函数中的对象中

Javascript 函数中的“this”在函数中的对象中,javascript,node.js,Javascript,Node.js,我对节点模块中的这种行为感到非常困惑。以下是相关片段: module.exports = function(environment) { var config = require('./config'); return { config: config, agencies: ["string1", "string2"], getRoutes: function(callback) { var API =

我对节点模块中的这种行为感到非常困惑。以下是相关片段:

module.exports = function(environment) {
    var config = require('./config');

   return {
        config: config,
        agencies:  ["string1", "string2"],

        getRoutes: function(callback) {
            var API = "/api/route/";
            this.agencies.forEach( function(agency) {
                console.log(this.config); //Returns undefined??
            }
       }
   }
}
查看表示对象中的函数中的this指的是对象。然后,我希望console.logthis.config引用required配置模块。相反,现在还不清楚this最终指的是什么,只是它没有config属性

显然,某个地方正在发生范围变化,但我不确定在哪里。弗雷奇?我试着安慰他,但我找回了一个我无法破译的巨大物体

我不明白为什么config不在这个函数的范围内。这是怎么回事?

这是未定义的,因为函数中的默认值是全局对象

要修复它,请将对象作为第二个参数传递给.forEach

其工作方式是由函数的调用方式决定。因为.forEach不知道您希望回调中的this值是什么,所以它将其保留为默认值,即全局对象,或者在严格模式下未定义

通过传递第二个参数,您告诉它手动将其设置为您提供的任何值

它是如何实现的,或者您是如何实现的,就是使用函数的.call或.apply方法调用函数

myFunction.call({foo:"bar"});
现在将调用myFunction,并将{foo:bar}对象设置为其this值。

它未定义,因为函数中this的默认值是全局对象

要修复它,请将对象作为第二个参数传递给.forEach

其工作方式是由函数的调用方式决定。因为.forEach不知道您希望回调中的this值是什么,所以它将其保留为默认值,即全局对象,或者在严格模式下未定义

通过传递第二个参数,您告诉它手动将其设置为您提供的任何值

它是如何实现的,或者您是如何实现的,就是使用函数的.call或.apply方法调用函数

myFunction.call({foo:"bar"});

现在将调用myFunction,并将{foo:bar}对象设置为其this值。

上下文切换发生在循环中,因为我相信在循环中这就是代理

module.exports = function(environment) {
var config = require('./config');

return {
    config: config,
    agencies:  ["string1", "string2"],

    getRoutes: function(callback) {
        var API = "/api/route/";
        var self = this;
        this.agencies.forEach( function(agency) {
            console.log(self.config); //Returns undefined??
        }
   }
 }
} 

上下文转换发生在循环中,因为我相信在循环中这就是代理

module.exports = function(environment) {
var config = require('./config');

return {
    config: config,
    agencies:  ["string1", "string2"],

    getRoutes: function(callback) {
        var API = "/api/route/";
        var self = this;
        this.agencies.forEach( function(agency) {
            console.log(self.config); //Returns undefined??
        }
   }
 }
} 
它的值取决于如何调用它所在的函数

以下是它的功能:

function(agency) {
    console.log(this.config); //Returns undefined??
}
它被作为一个论点传递给agencies.forEach。代理是一个数组,因此我们可以查看:

如果为forEach提供了thisArg参数,则在调用时会将其传递给callback,以用作其this值。否则,将传递未定义的值作为其此值使用

所以这是未定义的

根据上述文档,您可以为此传递不同的值

this.agencies.forEach( 
        function(agency) {
            console.log(this.config); //Returns undefined??
        },
        this
);
在这种情况下,您可以使用闭包。来自var config的config=require./config';仍将在范围内。因此,只需使用config而不是this.config。

它的值取决于如何调用它所在的函数

以下是它的功能:

function(agency) {
    console.log(this.config); //Returns undefined??
}
它被作为一个论点传递给agencies.forEach。代理是一个数组,因此我们可以查看:

如果为forEach提供了thisArg参数,则在调用时会将其传递给callback,以用作其this值。否则,将传递未定义的值作为其此值使用

所以这是未定义的

根据上述文档,您可以为此传递不同的值

this.agencies.forEach( 
        function(agency) {
            console.log(this.config); //Returns undefined??
        },
        this
);
在这种情况下,您可以使用闭包。来自var config的config=require./config';仍将在范围内。因此,只需使用config而不是this.config。

函数中的此值取决于创建和调用它的环境。当您使用forEach时,您将向它传递一个匿名函数作为第一个参数,它有自己的块作用域

有几种方法可以在函数中控制此值。您可以在父作用域中创建本地引用,该引用可通过闭包访问:

    getRoutes: function(callback) {
        var API = "/api/route/";
        var me = this; // local reference to the current scope
        this.agencies.forEach( function(agency) {
            console.log(me.config); // accessed via closure
        });
   }
。。。您可以绑定函数:

    getRoutes: function(callback) {
        var API = "/api/route/";
        this.agencies.forEach( function(agency) {
            console.log(this.config);
        }.bind(this))
   }
。。。或者,您可以将上下文作为第二个参数传递给forEach,并让引擎为您绑定范围:

    getRoutes: function(callback) {
        var API = "/api/route/";
        var me = this;
        this.agencies.forEach( function(agency) {
            console.log(this.config); 
        }, this);
   }
文件

forEach- 绑定- 函数中的值取决于创建和调用它的环境。当您使用forEach时,您将向它传递一个匿名函数作为第一个参数,它有自己的块作用域

有几种方法可以在函数中控制此值。您可以在父作用域中创建本地引用,该引用可通过闭包访问:

    getRoutes: function(callback) {
        var API = "/api/route/";
        var me = this; // local reference to the current scope
        this.agencies.forEach( function(agency) {
            console.log(me.config); // accessed via closure
        });
   }
。。。您可以绑定函数:

    getRoutes: function(callback) {
        var API = "/api/route/";
        this.agencies.forEach( function(agency) {
            console.log(this.config);
        }.bind(this))
   }
。。。或者,您可以将上下文作为第二个参数传递给forEach,并让引擎为您绑定范围:

    getRoutes: function(callback) {
        var API = "/api/route/";
        var me = this;
        this.agencies.forEach( function(agency) {
            console.log(this.config); 
        }, this);
   }
文件

forEach- 绑定- 在forEach函数中,您现在处于不同的
租金背景。因此,这是不同的。每个函数调用都会在被调用函数中为此建立一个值,包括对.forEach处理程序的每次迭代所做的调用。注意:一些迭代器函数(例如)将在此上下文中建立自定义值,例如正在迭代的项。但是,它仍然是一个不同的函数执行上下文。有点离题,但您根本不需要对返回对象的引用。您已经有了一个配置变量,getRoutes和回调函数将关闭该变量,因此您只需执行console.logconfig;。在forEach函数中,您现在处于不同的上下文中。因此,这是不同的。每个函数调用都会在被调用函数中为此建立一个值,包括对.forEach处理程序的每次迭代所做的调用。注意:一些迭代器函数(例如)将在此上下文中建立自定义值,例如正在迭代的项。但是,它仍然是一个不同的函数执行上下文。有点离题,但您根本不需要对返回对象的引用。您已经有了一个配置变量,getRoutes和回调函数将关闭该变量,因此您只需执行console.logconfig;。函数中的范围是指函数本身。那是不对的。在JavaScript中,它很少提及函数本身。要使其引用函数,需要执行类似myFunction.callmyFunction的操作;或myFunction.func=myFunction;myFunction.func;,这两个都是非常重要的unusual@cookiemonster呃,可以用更好的措辞,这个在一个函数中的范围是指这个函数本身。那是不对的。在JavaScript中,它很少提及函数本身。要使其引用函数,需要执行类似myFunction.callmyFunction的操作;或myFunction.func=myFunction;myFunction.func;,这两个都是非常重要的unusual@cookiemonster呃,可以用更好的措辞。我欠你一票,但没有代表。这是一个很好的回答,既有更正,也有解释。@ABMagil:没问题。很高兴它起到了作用。一个请求-您能否在示例代码中澄清设置“this”值的注释是指在函数范围内设置“this”,前提是我理解正确?在第一次阅读时,我不确定你的意思。@ABMagil:是的,这在函数的执行中是有价值的。虽然人们有时将其称为范围,但这并不是完全无关的,从技术上讲,谈论这个值与谈论变量范围是不同的。函数中的这个值是一个动态值,可以通过各种不同的方式隐式或显式设置,因此并不总是有一个简单的可预测值。它的可预测性来自开发人员编写的代码,或者来自您正在使用的API的文档。我欠您一票,但没有代表。这是一个很好的答案,有更正和解释。@ABMagil:没问题。很高兴它起到了作用。一个请求-您能否在示例代码中澄清设置“this”值的注释是指在函数范围内设置“this”,前提是我理解正确?在第一次阅读时,我不确定你的意思。@ABMagil:是的,这在函数的执行中是有价值的。虽然人们有时将其称为范围,但这并不是完全无关的,从技术上讲,谈论这个值与谈论变量范围是不同的。函数中的这个值是一个动态值,可以通过各种不同的方式隐式或显式设置,因此并不总是有一个简单的可预测值。它的可预测性来自开发人员编写的代码,或者来自您正在使用的API的文档。