Передавая область для forEach
Я пытаюсь использовать метод обратного вызова 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 ответа
Вам нужно использовать Function#bind
чтобы связать сферу:
words.forEach(this.addToCount.bind(this));
Обратите внимание, что это доступно не во всех браузерах: вы должны использовать прокладку (как указано в ссылке выше), чтобы добавить ее в браузеры, которые не поддерживают Function#bind
,
Как указывает Дандевис в комментариях, вы можете передать значение Array#forEach
в качестве контекста для обратного вызова:
words.forEach(this.addToCount, this);
Попробуйте что-то вроде этого. Я использовал 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;
});
}
}