Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.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 如何处理;这";事件侦听器中使用函数的上下文?_Javascript - Fatal编程技术网

Javascript 如何处理;这";事件侦听器中使用函数的上下文?

Javascript 如何处理;这";事件侦听器中使用函数的上下文?,javascript,Javascript,我构造了一个对象,将单击和按键事件侦听器应用于页面上的指定元素 事件触发使用对象中存储的数据的函数 我需要能够使用“this”关键字(当然?),但由于函数的调用方式,“this”关键字指向窗口对象 为了解决这个问题,我在我的对象中保存了“处理程序”,这些处理程序引用函数并将.bind(this)应用到它们 然后我可以在它们上使用移除和添加事件监听器,同时保持上下文指向我的对象 document.addEventListener( "mousemove", this.handlers.inputM

我构造了一个对象,将单击和按键事件侦听器应用于页面上的指定元素

事件触发使用对象中存储的数据的函数

我需要能够使用“this”关键字(当然?),但由于函数的调用方式,“this”关键字指向窗口对象

为了解决这个问题,我在我的对象中保存了“处理程序”,这些处理程序引用函数并将.bind(this)应用到它们

然后我可以在它们上使用移除和添加事件监听器,同时保持上下文指向我的对象

document.addEventListener( "mousemove", this.handlers.inputMouseMoveHandler );
document.addEventListener( "keydown", this.handlers.inputDownHandler );
document.addEventListener( "keyup", this.handlers.inputUpHandler );


本质上,我想知道这是否是正确的方法?

这是一个与其他方法一样好的解决方案,特别是如果您以后需要删除这些特定的处理程序。我这么说。将其分配给变量以便可以从子函数访问它是很常见的。这真的是绕过每个函数都有自己的这一事实的唯一方法。@Ryhnn这是矛盾的-后者也是一个好方法,但它不是你在前几句话中同意的;-)。正如在基于jQuery的代码中发生的那样,我更喜欢后一种方法,因为它保留了jQuery语义,即
this
指的是接收事件的元素,而不是封闭的对象然后使用mythis.inputMouseMove而不必存储处理程序,以后才能正确删除它们?[编辑:下划线未显示]
document.addEventListener( "mousemove", this.handlers.inputMouseMoveHandler );
document.addEventListener( "keydown", this.handlers.inputDownHandler );
document.addEventListener( "keyup", this.handlers.inputUpHandler );
document.removeEventListener( "mousemove", this.handlers.inputMouseMoveHandler );
document.removeEventListener( "keydown", this.handlers.inputDownHandler );
document.removeEventListener( "keyup", this.handlers.inputUpHandler );