将数组值作为参数传递会导致未定义

时间:2016-11-20 12:19:26

标签: javascript parameters undefined

我的阵列:

     var alphabet = ['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'];

将功能设置为按钮:

var alphabet = ['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'];

for (var idx = 0; idx < alphabet.length; idx++) {
  var bttn = document.createElement("button");
  bttn.innerText = alphabet[idx];
  bttn.onclick = function() {
    this.disabled = true;
    checkIfWordContainLetter(alphabet[idx]);
  }
  document.getElementById("hangmanContent").appendChild(bttn);
}

function checkIfWordContainLetter(letter) {
  alert(wordToGuess);
  alert(letter);
}

当我将undefined作为参数传递时会导致alphabet[idx],但如果我通过'a'传递a,则会CFrameWndEx

4 个答案:

答案 0 :(得分:1)

尝试以下代码:

var alphabet = ['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'];
for(var idx=0;idx<alphabet.length;idx++)
		{
			var bttn = document.createElement("button");
			bttn.innerText = alphabet[idx];
			
			bttn.onclick = function () {this.disabled=true;
			
			checkIfWordContainLetter(this.innerText);
			}
			document.getElementById("hangmanContent").appendChild(bttn);
		}



function checkIfWordContainLetter(letter)
	{		
		alert(letter);
		alert(letter); 
		
	}
<body>
<div id="hangmanContent"></div>
</body>

答案 1 :(得分:1)

这是与范围相关的问题。

当您点击该按钮时,idx等于26,因为for已经结束,此索引在数组中不存在。

您可以简单地更正var idx更改为let idx,但请注意,这仅适用于现代浏览器。

传统解决方案可能是:

for (var idx = 0; idx < alphabet.length; idx++) {
    var bttn = document.createElement("button");
    bttn.innerText = alphabet[idx];
    bttn.onclick = (function (index) {
        return function () {
            this.disabled = true;
            checkIfWordContainLetter(alphabet[index]);
        }
    } (idx));
    document.getElementById("hangmanContent").appendChild(bttn);
}

阅读:Lexile mesures

答案 2 :(得分:1)

这是解决方案:

var alphabet = ['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'];
for(var idx=0;idx<alphabet.length;idx++)
{
        var bttn = document.createElement("button");
        bttn.innerText = alphabet[idx];
        bttn.onclick = function (idx)
        { 
           this.disabled=true;
           checkIfWordContainLetter(alphabet[idx]);
        }.bind(this, idx);
        document.getElementById("hangmanContent").appendChild(bttn);
}

function checkIfWordContainLetter(button)
{       
    //alert(wordToGuess);
    alert(button.innerText); 

}

答案 3 :(得分:1)

你应该了解javaScript的闭包。 单击其中一个按钮时,将执行事件处理程序。你将checkIfWordContainLetter(alphabet[idx])中的idx暴露为1,2,3,4 .....但是,它总是(alphabet.length + 1)。它们都指的是记忆中的同一个地方。