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的文档。