JavaScript';s数组调用和函数在原型内部失败
我有以下代码:JavaScript';s数组调用和函数在原型内部失败,javascript,prototype,Javascript,Prototype,我有以下代码: function Keyboard() { this.log = $('#log')[0]; this.pressedKeys = []; this.bindUpKeys = function() { $('body').keydown(function(evt) { this.pressedKeys.push(evt.keyCode); var li = this.pressedKey
function Keyboard() {
this.log = $('#log')[0];
this.pressedKeys = [];
this.bindUpKeys = function() {
$('body').keydown(function(evt) {
this.pressedKeys.push(evt.keyCode);
var li = this.pressedKeys[evt.keyCode];
if (!li) {
li = this.log.appendChild(document.createElement('li'));
this.pressedKeys[evt.keyCode] = li;
}
$(li).text('Down: ' + evt.keyCode);
$(li).removeClass('key-up');
});
}
this.bindDownKeys = function() {
$('body').keyup(function(evt) {
this.pressedKeys.push(evt.keyCode);
var li = this.pressedKeys[evt.keyCode];
if (!li) {
li = this.log.appendChild(document.createElement('li'));
}
$(li).text('Up: ' + evt.keyCode);
$(li).addClass('key-up');
});
}
}
我发现以下错误:
TypeError: 'undefined' is not an object (evaluating 'this.pressedKeys.push')
我想对数组做什么并不重要,它只是不断地给我访问错误,就好像它不存在于原型中一样
我做错了什么(我只是将数组作为原型中的任何其他值进行访问)。对象内部的对象是否存在问题?问题在于,在事件处理程序
内部,这与您的想法不同。您可以使用bind
方法绑定事件处理程序函数(或者,因为它看起来像是在使用jQuery,):
或者,您可以在事件处理程序外部存储对该
的引用,例如:
this.bindUpKeys = function() {
var that = this;
$('body').keydown(function(evt) {
//Use `that` instead of `this` in here
});
}
好像它不存在于原型中
不,是的
我正在访问阵列
这就是你不知道的此
不会指向事件侦听器中的键盘
实例
当函数作为事件侦听器调用时,DOM元素将成为上下文(jQuery也会这样做)。有关详细信息,请参阅MDN的概述。您可以使用闭包范围的变量来保存对实际实例的引用,例如所述(关于这一点有很多问题)
可能的快速修复方法:
$('body').keydown((function(){…}).bind(this))
var=this$('body').keydown(function(){that.pressedKeys…;})代码>
this.bindUpKeys = function() {
var that = this;
$('body').keydown(function(evt) {
//Use `that` instead of `this` in here
});
}