我试图制作一个试图访问列表中第一项的函数来制作一个konami代码网站。定义列表,然后定义函数以编辑列表。这是代码
<html><body>
<script>
var keys = [38,38,40,40,37,39,37,39,66,65];
function keyhandler (e) {
e = e || event;
console.log(e.keyCode);
var key = keys[0];
if (key == e.keyCode) {
console.log("correct key");
if (keys.length == 1){
console.log("konami");
} else {
var keys = keys[1,keys.length];
}
}
else {
var keys = [38,38,40,40,37,39,37,39,66,65];
}
}
document.onkeydown = keyhandler;
</script>
</body></html>
当我通过按键触发该功能时,我收到此错误: 未捕获的TypeError:无法读取属性&#39; 0&#39;未定义错误是由var key = keys [0] line
引起的答案 0 :(得分:1)
var keys = keys[1,keys.length];
您已在函数内创建了一个新的(本地作用域)keys
变量,并且它正在屏蔽包含您尝试读取的数组的变量。请记住:var
语句已被提升。
对这两个变量使用不同的名称(或者如果它们假设是同一个变量,则从内部变量中删除var
语句。)
注意:在JavaScript中,[1,keys.length]
只是comma operator,而不是slice。
答案 1 :(得分:1)
您正在初始化函数内的另一个名为keys
的变量(var keys = keys[1, keys.length]
)。这会影响外部变量。删除var
关键字以访问正确的变量。
另外,我相信您要从列表中删除第一个元素。为此,请使用shift
。
keys.shift();
这将直接修改数组,因此您无需将结果分配给任何内容。
答案 2 :(得分:0)
正如昆汀所说,你的功能正在发生。 这里的其他海报也说过,你在函数中定义了一个新的局部变量。
让我在Javascript解释您的代码时,通过提升来显示您的功能:
var keys = [38,38,40,40,37,39,37,39,66,65];
function keyhandler (e) {
// Javascript defines all the local variables at top.
// This is what hoisting is
var key;
var keys;
e = e || event;
console.log(e.keyCode);
// at this point, local variable keys isn't initialized,
// that's why you are getting the undefined error.
key = keys[0];
if (key == e.keyCode) {
console.log("correct key");
if (keys.length == 1){
console.log("konami");
} else {
// you are referencing a local variable here
keys = keys[1,keys.length];
}
}
else {
// you are referencing a local variable here
keys = [38,38,40,40,37,39,37,39,66,65];
}
}
document.onkeydown = keyhandler;
正如其他海报所提到的那样,只需从密钥中删除var就可以解决您的问题,如果这意味着什么,但我认为了解Javascript技术上在这种情况下的作用非常重要。
答案 3 :(得分:0)
问题在于
var key = keys[0];
不是评论中提到的javascript表达式,需要替换为
var key = keys.slice(0,2);