javascript类对象,keyevent中的方法不起作用

时间:2013-08-21 14:07:48

标签: javascript oop

为什么method1在init中直接工作但在由keyevent触发时不起作用。 在32,39 keyevent它不起作用,但在keyevent 37它的工作原理。所以,该功能应该有效。

init函数也可以,例如当我初始化method2时,方法正在运行method1。这有效,但为什么keyevent不起作用?

function myClass() {
    this.method1 = function method1(word) {
        alert(word)
    }
    this.method2 = function method2(word) {
        this.method1(word);
    }
    this.shortcutKey = function shortcutKey() {
        document.onkeydown = function (event) {
            if (event.keyCode == 32 || event.keyCode == 39) {
                this.method1("undirect");
            } else if (event.keyCode == 37) {}
        }
    }
    this.init = function init() {
        this.method2("direct init");
        this.shortcutKey();
    }
    this.init();
}
var object = new myClass();

3 个答案:

答案 0 :(得分:2)

this关键字在不同的上下文中具有不同的值。

回调this内部必须引用window对象except in strict mode。启用严格模式后,this将在对象上下文之外undefined

问题是onkeydown事件未在MyClass的上下文中执行。要解决此问题,您需要创建对目标上下文的引用,如:

this.shortcutKey = function shortcutKey() {
    var self = this; // create reference to context

    document.onkeydown = function(event) {
        if( event.keyCode==32 || event.keyCode==39 ) {
            self.method1("undirect");
        }
    }   
}

答案 1 :(得分:1)

查看控制台,您将看到错误消息

  

TypeError:this.method1不是函数[Break On This Error]

     

this.method1( “undirect”);

此错误的原因是作用域。

this的范围指向错误的东西,您需要在keydown函数之外引用this。查看调试语句,了解this实际上是什么。

this.shortcutKey = function shortcutKey() {
    var objScope = this;
    document.onkeydown = function (event) {
        if (event.keyCode == 32 ||
            event.keyCode == 39) {
            console.log("this", this);   /* this Window /_display/ */
            console.log("objScope", objScope);
            objScope.method1("undirect");
        } else if (event.keyCode == 37) {}
    }
}

答案 2 :(得分:0)

致电时

this.method1("undirect");

“this”的范围发生了变化。它现在指的是它直接的功能。 要引用您想要引用的“this”,您必须先将它分配给temp var,以便使用范围:

function myClass() {
    this.method1 = function method1(word) {
        alert(word)
    }
    this.method2 = function method2(word) {
        this.method1(word);
    }
    this.shortcutKey = function shortcutKey() {
        var that = this
        document.onkeydown = function (event) {
            if (event.keyCode == 32 || event.keyCode == 39) {
                that.method1("undirect");
            } else if (event.keyCode == 37) {}
        }
    }
    this.init = function init() {
        this.method2("direct init");
        this.shortcutKey();
    }
    this.init();
}
var object = new myClass();