【发布时间】:2023-04-04 16:37:01
【问题描述】:
考虑以下代码...使用 Hammer.js,但我认为这可能是一个通用的 Javascript 问题:
var drawLayer = new DrawLayer(document.getElementById('canvasContainer'));
function DrawLayer(targetElement) {
this.foo = "bar";
this.gestureDetection = new Hammer.Manager(targetElement);
this.gestureDetection.add(new Hammer.Pan({
direction : Hammer.DIRECTION_ALL,
threshold : 0
}));
this.gestureDetection.add(new Hammer.Press({
time : 0,
threshold : 5
}));
this.gestureDetection.on("press", this.drawBegin);
this.gestureDetection.on("panmove", this.drawMove);
this.gestureDetection.on("panend pressup", this.drawEnd);
this.drawBegin("INIT TEST");
}
DrawLayer.prototype.drawBegin = function (gestureData) {
console.log(typeof(this.foo));
console.log("DRAW BEGIN!");
}
DrawLayer.prototype.drawMove = function (gestureData) {
console.log(this.foo);
console.log("DRAW MOVE!");
}
DrawLayer.prototype.drawEnd = function (gestureData) {
console.log(this.foo);
console.log("DRAW END!");
}
当我第一次运行它时,我得到了这个,正如预期的那样:
string
DRAW BEGIN!
但是当实际处理手势时(即通过事件调用绘图内容时),我得到:
undefined
DRAW BEGIN!
更多到这一点 - 似乎在处理任何这些 drawBegin/etc 时。方法,“this”是未定义的,好像它以某种方式失去了范围?
我想要一个解决方案和一个解释。谢谢!
【问题讨论】:
-
this的值仅取决于函数的调用方式。不要将obj.drawMove直接传递给事件处理程序注册函数,而是传递一个匿名包装函数,该函数通过对象引用调用drawMove。
标签: javascript scope closures hammer.js