Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript';s数组调用和函数在原型内部失败_Javascript_Prototype - Fatal编程技术网

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
    });
}