Javascript addEventListener在函数内部失败

Javascript addEventListener在函数内部失败,javascript,Javascript,添加事件侦听器时遇到问题。我基本上是将所有与键盘相关的函数封装到一个JavaScript类中,如下所示: function Keyboard() { this.key = new Array(); for(x=0;x<255;x++) { this.key[x] = false; } function keyDown(evt) { this.key[evt.keyCode] = true;

添加事件侦听器时遇到问题。我基本上是将所有与键盘相关的函数封装到一个JavaScript类中,如下所示:

function Keyboard()
{
    this.key = new Array();

    for(x=0;x<255;x++)
    {
        this.key[x] = false;
    }

    function keyDown(evt)
    {
        this.key[evt.keyCode] = true;
        console.log("Keydown bioch");
    }

    function keyUp(evt)
    {
        this.key[evt.keyCode] = false;
    }

    window.addEventListener('keydown', this.keyDown, true);
    window.addEventListener('keyup', this.keyUp, true);
}
功能键盘()
{
this.key=新数组();
对于(x=0;x您在不合适的地方使用。此外,您的对象没有
keyDown
/
keydup
属性

您需要取消对数组的引用,因为侦听器中的
将指向事件接收(dom)元素,该元素没有
属性。要引用本地函数,只需使用它们的名称:

function Keyboard() {
    var arr = this.key = new Array();
    for(x=0;x<255;x++)
        arr[x] = false;

    function keyDown(evt) {
        arr[evt.keyCode] = true;
        console.log("Keydown bioch");
    }
    function keyUp(evt) {
        arr[evt.keyCode] = false;
    }

    window.addEventListener('keydown', keyDown, true);
    window.addEventListener('keyup', keyUp, true);
}
功能键盘(){
var arr=this.key=new Array();
对于(x=0;x您在不合适的地方使用。此外,您的对象没有
keyDown
/
keydup
属性

您需要取消对数组的引用,因为侦听器中的
将指向事件接收(dom)元素,该元素没有
属性。要引用本地函数,只需使用它们的名称:

function Keyboard() {
    var arr = this.key = new Array();
    for(x=0;x<255;x++)
        arr[x] = false;

    function keyDown(evt) {
        arr[evt.keyCode] = true;
        console.log("Keydown bioch");
    }
    function keyUp(evt) {
        arr[evt.keyCode] = false;
    }

    window.addEventListener('keydown', keyDown, true);
    window.addEventListener('keyup', keyUp, true);
}
功能键盘(){
var arr=this.key=new Array();
对于(x=0;x,回调函数中的“this”引用引用的是窗口对象,而不是您可能期望的函数范围

看看这个答案

回调函数中的“this”引用引用的是窗口对象,而不是预期的函数范围

看看这个答案


您创建了该类的实例了吗?您执行了该函数了吗?您创建了该类的实例了吗?您执行了该函数了吗?@Sosukodo:此外,当您将键盘类的内容设置为全局时,一切都正常,因为“this.keyDown”和“this.keydup”都引用了“全局窗口对象”(Window)。它包含keyDown和keydup函数,比如方法,你可以用“this”关键字来引用它们……但是你不应该,是的。我很确定他会用“new”来调用它。您的代码是正确的。我的评论只是解释全局范围内行为的一个注释。@Bergi感谢您的回答。虽然我不完全理解JavasScript的复杂性,但您已经帮助我完全理解了我为什么讨厌它。@Sosukodo:此外,当您将键盘类的内容设置为全局时,所有内容都可以工作,因为“this.keyDown”和“this.keydup”是指“全局窗口对象”(Window)。它包含keyDown和keydup函数,比如方法,你可以用“this”关键字来引用它们……但是你不应该,是的。我很确定他会用“new”来调用它"。您的代码是正确的。我的评论只是一个注释,用于解释全局范围内的行为。@Bergi感谢您的回答。虽然我不完全理解JavasScript的复杂性,但您帮助我完全理解了我为什么讨厌它。我也感谢您的回答。不过,我倾向于接受那些给出完整代码示例+e的答案解释。我也很感激你的回答。不过,我倾向于接受那些给出完整代码示例+解释的答案。