0

为什么method1直接在 init 中有效,但在由 keyevent 触发时无效。在 32,39 keyevent 上它不起作用,但在 keyevent 37 上它起作用。因此,该功能应该可以工作。

init函数也可以工作,例如当我 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();
4

3 回答 3

2

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

回调内部this必须可能引用window对象,但严格模式除外。当启用严格模式时,thisundefined在对象上下文之外。

问题是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");
        }
    }   
}
于 2013-08-21T14:13:21.553 回答
1

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

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

this.method1("undirect");

此错误的原因是作用域。

的范围this是指向错误的东西,你需要this在 keydown 函数之外引用。查看调试语句以了解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) {}
    }
}
于 2013-08-21T14:13:48.443 回答
0

你打电话时

this.method1("undirect");

“这个”的范围发生了变化。它现在确实引用了它直接所在的函数。要引用您要引用的“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();
于 2013-08-21T14:16:28.937 回答