为什么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();
答案 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();