属性 使用此关键字在对象字面量中未定义的变量

Property variable undefined in object literal using this keyword

我正在尝试理解 OOP,这是我第一次真正的尝试。我很困惑为什么 init 对象中的 word 属性 变量在 checkLetter 函数 console.log 中不可用,即使我正在使用 this 关键字。在我的 pickWord 函数中,我可以毫无问题地使用 this.word。如何使 word 变量和 this.word.length 可用于 checkLetter

var words = ["cancer", "aids", "stroke", "diabetes" ];

var keys = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];

point = 0;

var init = {
  word: "",
  word_index: 0,
  point_status: 0,
  pickWord: function(){
    this.word = words[this.word_index];  
    this.displayDashes(this.word);
  },

  displayDashes: function(word){
    for(var i = 0; i< word.length; i++){
      var blankLetter = document.createElement("div");

      var hiddenletter = document.createTextNode(word[i]);
      blankLetter.appendChild(hiddenletter);

      blankLetter.classList.add('dashes');

      var wordHolder = document.getElementById('wordHolder');

      wordHolder.appendChild(blankLetter);


    }

  },

  addKeys: function(){
    for (var i = 0; i < keys.length; i++){
      var key = document.createElement("div");
      key.classList.add('keys');

      key.onclick = this.checkLetter;

      var letter = document.createTextNode(keys[i]);
      key.appendChild(letter);

      var keyboard = document.getElementById('keyboard');

      keyboard.appendChild(key);


    }
  },

  checkLetter: function(){

   var letterElems = document.getElementsByClassName('dashes');

   this.style.backgroundColor = 'blue';

   for(var i = 0; i < letterElems.length; i++){
     if(this.innerHTML == letterElems[i].innerHTML){
       letterElems[i].style.backgroundColor = 'white';
       pointStatus = point++;

     }
   }
  // checkPoints(pointStatus);
   // console.log(point); 
   console.log("the word: " + this.word); 

   if(point == this.word.length){
      alert('you won ' + point + " points so far!");
      this.nextWord();

    }  
  },


  nextWord: function(){
      alert('im inside nexword');
      this.word_index++;
      this.pickWord();
  }
}

init.pickWord();
init.addKeys();
// init.displayDashes();

在元素的上下文中调用 key.onclick 事件处理程序。所以 'this' 是元素。有许多方法可以解决此问题。一种方法是将 'this' 的值绑定到 init 对象:

key.onclick = this.checkLetter.bind(this);

编辑:如果您需要访问事件处理程序的元素,您可以将事件作为函数参数包含在内,并使用 'currentTarget' 属性 访问该元素。例如。 evt.currentTarget.

checkLetter: function(evt){
    var elem = evt.currentTarget;