我对节点模块中this
的行为感到非常困惑。以下是相关摘录:
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??
}
}
}
}
查看MDN documentation on this表示对象函数中的this
引用该对象。然后我希望console.log(this.config)
引用require'd配置模块。相反,不清楚this
最终指的是什么,除了它没有“config”属性。
console.log(this)
,但我找回了一个我无法解读的巨大物体。
我不明白为什么配置超出了这个功能的范围。发生了什么事?
答案 0 :(得分:7)
它是undefined
因为函数中的this
的默认值是全局对象。
要解决此问题,请将对象作为第二个参数传递给.forEach()
this.agencies.forEach( function(agency) {
console.log(this.config)
}, this)
// ^---sets the `this` value
this
的工作方式是由如何调用函数决定。由于.forEach()
不知道您对回调中this
值的要求,因此将其保留为默认值(全局对象)或严格模式下的undefined
。 / p>
通过传递第二个参数,您告诉它手动将this
设置为您提供的任何内容。
如何完成此操作(或者无论如何都可以完成)是使用函数的.call()
或.apply()
方法调用函数。
myFunction.call({foo:"bar"});
现在myFunction
将在{foo:"bar"}
对象设置为this
值的情况下调用。
答案 1 :(得分:3)
上下文切换发生在循环中,因为在内部我认为这是“代理”
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??
}
}
}
}
答案 2 :(得分:1)
函数中this
的值取决于创建和调用它的环境。当您使用forEach
时,您将向其传递一个匿名函数作为第一个参数,该参数具有this
引用的自己的块范围。
有几种方法可以控制函数中this
的值。您可以在父作用域中创建本地引用,可以通过闭包访问:
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
});
}
...你可以bind
功能:
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);
}
<强>文档强>
答案 3 :(得分:0)
this
的值取决于它所处的函数的调用方式。
这是它的功能:
function(agency) {
console.log(this.config); //Returns undefined??
}
它作为参数传递给agencies.forEach
。 agencies
是一个数组,因此我们可以查看the documentation:
如果为forEach提供了thisArg参数,则在调用时它将被传递给回调,以用作其值。否则,将传递undefined值以用作其值。
所以this
是undefined
。
根据上述文档,您可以为this
传递不同的值。
this.agencies.forEach(
function(agency) {
console.log(this.config); //Returns undefined??
},
this
);
在这种情况下,您可以使用闭包。 config
(来自var config = require('./config');
)仍然在范围内。因此,只需使用config
代替this.config
。