列表范围javascript的问题

时间:2015-12-16 17:29:15

标签: javascript

我试图制作一个试图访问列表中第一项的函数来制作一个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

引起的

4 个答案:

答案 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);