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

时间:2014-02-17 19:06:09

标签: javascript node.js

我对节点模块中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”属性。

显然,某个地方会发生范围变化,但我不确定在哪里。 forEach?我试着只是console.log(this),但我找回了一个我无法解读的巨大物体。

我不明白为什么配置超出了这个功能的范围。发生了什么事?

4 个答案:

答案 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.forEachagencies是一个数组,因此我们可以查看the documentation

  

如果为forEach提供了thisArg参数,则在调用时它将被传递给回调,以用作其值。否则,将传递undefined值以用作其值。

所以thisundefined

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

this.agencies.forEach( 
        function(agency) {
            console.log(this.config); //Returns undefined??
        },
        this
);

在这种情况下,您可以使用闭包。 config(来自var config = require('./config');)仍然在范围内。因此,只需使用config代替this.config