将范围传递给forEach

时间:2013-11-01 19:11:58

标签: javascript

我正在尝试在addToCount中使用回调方法forEach而不是匿名函数。但是我无法访问其中的this.count(返回undefined)。

function Words(sentence) {
  this.sentence = sentence;
  this.count = {};
  this.countWords();
}

Words.prototype = {
  countWords: function() {
    var words = this.sentence.split(/\W+/);
    words.forEach(this.addToCount);
  },
  addToCount: function(word) {
    word = word.toLowerCase();
    if (word == '') return;
    if (word in this.count)
      this.count[word] += 1;
    else
      this.count[word] = 1;
  }
}

我认为问题在于范围。如何将this传递给addToCount或者还有其他方法可以使其发挥作用吗?

2 个答案:

答案 0 :(得分:66)

您需要使用Function#bind绑定范围:

words.forEach(this.addToCount.bind(this));

请注意,并非所有浏览器都提供此功能:您应该使用填充程序(如上面的链接中所提供的)将其添加到不支持Function#bind的浏览器中。


正如dandavis在评论中指出的那样,您可以将值传递给Array#forEach作为回调的上下文:

words.forEach(this.addToCount, this);

答案 1 :(得分:1)

尝试这样的事情。我使用了that而不是_this,但我也移动了addToCount,因此它位于countWords内。这会将countWords转换为包含该内容的闭包。

Words.prototype = {
  countWords: function() {
    var that = this, words = this.sentence.split(/\W+/);
    words.forEach(function(word) {
        word = word.toLowerCase();
        if (word == '') return;
        if (word in that.count)
          that.count[word] += 1;
        else
          that.count[word] = 1;
      });
  }
}