Javascript 听众失去了对“的引用”;这是—jQuery

Javascript 听众失去了对“的引用”;这是—jQuery,javascript,jquery,Javascript,Jquery,我有一个为鼠标事件初始化画布元素的类。侦听器是在构造函数中初始化的,但当我在触发事件时调用findxy时,对this.flag等变量的引用会导致错误,因为它们未定义,这使我相信,在调用findxy时,侦听器正在丢失对this的引用。我不完全确定如何解决这个问题。提前谢谢 类签名{ 构造函数(){ this.signed=false; 这个.prevX=0; 这个.currX=0; 这个.prevY=0; 此值为0.currY; this.dot_标志=false; this.flag=fals

我有一个为鼠标事件初始化画布元素的类。侦听器是在构造函数中初始化的,但当我在触发事件时调用
findxy
时,对
this.flag
等变量的引用会导致错误,因为它们未定义,这使我相信,在调用
findxy
时,侦听器正在丢失对
this
的引用。我不完全确定如何解决这个问题。提前谢谢

类签名{
构造函数(){
this.signed=false;
这个.prevX=0;
这个.currX=0;
这个.prevY=0;
此值为0.currY;
this.dot_标志=false;
this.flag=false;
this.canvas=document.getElementById('can');
this.ctx=this.canvas.getContext(“2d”);
this.w=this.canvas.width;
this.h=this.canvas.height;
this.canvas.addEventListener(“touchmove”,函数(e){
mobilexy(“移动”,e)
},假);
this.canvas.addEventListener(“touchstart”,函数(e){
mobilexy(“向下”,e)
},假);
this.canvas.addEventListener(“touchleef”,函数(e){
mobilexy('up',e)
},假);
this.canvas.addEventListener(“mousemove”,函数(e){
findxy('move',e)
},假);
this.canvas.addEventListener(“mousedown”,函数(e){
findxy('down',e)
},假);
this.canvas.addEventListener(“mouseup”,函数(e){
findxy('up',e)
},假);
this.canvas.addEventListener(“mouseout”,函数(e){
findxy('out',e)
},假);
findxy(res,e){
如果(res=='down'){
this.prevX=this.currX;
this.prevY=this.currY;
this.currX=e.pageX-this.canvas.offsetLeft;
this.currY=e.pageY-this.canvas.offsetTop;
this.flag=true;
this.dot_flag=true;
如果(此.dot_标志){
this.ctx.beginPath();
this.ctx.fillStyle=x;
this.ctx.fillRect(currX,currY,2,2);
this.ctx.closePath();
this.dot_标志=false;
}
}
如果(res==“向上”| res==“向外”){
this.flag=false;
}
如果(res=='move'){
如果(此标志){
this.prevX=this.currX;
this.prevY=this.currY;
this.currX=e.pageX-canvas.offsetLeft;
this.currY=e.pageY-canvas.offsetTop;
draw();
}
}
}

}
作用域不随调用传输。您需要将
引用作为参数传递:

this.canvas.addEventListener("mouseout", function (e) {
  findxy('out', e, this)
}, false); 

findxy(res, e, _this) {
  // call it something more appropriate than '_this' - this is just an example
  _this.prevY = ...;
}
或者使用
call()
提供作用域:

this.canvas.addEventListener("mouseout", function (e) {
  findxy.call(this, 'out', e)
}, false); 
或者使用jQuery替代
call()
,即
$.proxy()


作用域不随调用转移。您需要将
this
引用作为参数传递:

this.canvas.addEventListener("mouseout", function (e) {
  findxy('out', e, this)
}, false); 

findxy(res, e, _this) {
  // call it something more appropriate than '_this' - this is just an example
  _this.prevY = ...;
}
或者使用
call()
提供作用域:

this.canvas.addEventListener("mouseout", function (e) {
  findxy.call(this, 'out', e)
}, false); 
或者使用jQuery替代
call()
,即
$.proxy()


我尝试了这三种方法。第一种方法似乎没有任何作用。我不知道为什么,但我甚至无法在
findxy
的开头打印出
console.log(“test”);
。其他方法产生的错误与问题中指出的相同。如果
flag
导致错误,但其他方法没有(例如,
prevX
currX
等)然后我建议您在
findxy()中
console.log(这个)
要准确地确定所传递的内容是您所期望的。请注意,在事件处理程序中,
将是引发事件的元素,而不是您的
签名
类,如果这是您的意图,我尝试了所有三种方法。第一种方法似乎没有任何作用。我不确定原因,但我甚至无法获得答案
console.log(“test”);
findxy
开头打印出来。其他方法产生的错误与问题中指出的相同。如果
flag
导致错误,但其他方法没有(例如
prevX
currX
等),那么我建议您使用
console.log(此)
findxy()
中,以准确确定传递的内容是您所期望的内容。请注意,在事件处理程序中,
将是引发事件的元素,而不是您的
签名
类,如果这是您的意图的话