我正在尝试在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
或者还有其他方法可以使其发挥作用吗?
答案 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;
});
}
}