Прохождение сфера в цикле foreach

Я'м пытаюсь использовать метод обратного вызова addToCount вместо анонимной функции в объекту. Но я могу'т открыть это.граф в его (возвращает 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;
  }
}

Я думаю, что проблема в области. Как я могу передать это в addToCount или есть ли другой способ, чтобы заставить его работать?

Комментарии к вопросу (2)
Решение

Вы должны использовать #функция привязки для связывания область:

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

Обратите внимание, что это не во всех браузерах: следует использовать прокладку (как указано в ссылке выше), чтобы добавить его в браузерах, которые Дон't функция поддержки #персонализация.


Как dandavis отмечает, в комментариях, вы можете передать значение массив#цикл foreach в качестве контекста для обратного вызова:

words.forEach(this.addToCount, this);
Комментарии (5)

Попробовать нечто подобное. Я've использовали что, а не что, но также Я'вэ переехал addToCount так что's внутри 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;
      });
  }
}
Комментарии (1)