Javascript 获取用于在JS处理程序中触发事件的名称

Javascript 获取用于在JS处理程序中触发事件的名称,javascript,javascript-events,Javascript,Javascript Events,这是我的javascript代码 //Events to watch CanvasIO.events = [ "object:added", "object:removed", "object:modified", "object:rotating", "object:scaling", "object:moving" ]; //Socket connection CanvasIO.socket = io.connect('http://loca

这是我的javascript代码

//Events to watch
CanvasIO.events = [
    "object:added",
    "object:removed",
    "object:modified",
    "object:rotating",
    "object:scaling",
    "object:moving"
];

//Socket connection
CanvasIO.socket = io.connect('http://localhost:8080');

//Canvas events fired
for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(data){
        CanvasIO.socket.emit("canvas:event", {
            eventType: e,
            data: data
        });
    });
}

//Socket IO event received
CanvasIO.socket.on("canvas:event", function(data) {
    console.log("Received: " + data.eventType);
});
我的问题是,在Canvas事件激发部分中,我希望根据事件名称生成要发出的自动消息。但是因为我使用了
eventType:e
,所以每条消息都会得到
e
的最后一个状态,
“object:moving”

因此,对于:

CanvasManager.canvas.on(key, handler)

是否可以访问
处理程序中的
?如果没有,我应该如何继续?

问题是,随着for循环不断迭代,处理程序中的
e
值也在更新。要绕过此函数,可以将处理程序包装在传递给
e
的函数中(这称为“闭包”)。它的工作原理是为事件变量创建一个新的作用域,因此随着for循环的增加而保持不变,或者您可以使用(我相信)


这是一个经常出现的非常恼人的问题,这里有一些更多的信息:

我不确定发生了什么,但有一种猜测是,您的for循环肯定应该是
for(CanvasIO.events中的var e)
,而不是您如何拥有它。您正在定义一个全局e。谢谢您,此解决方案非常有效。我只需将
e
替换为
CanvasIO.events[e]
for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(event){
        return function(data){
            CanvasIO.socket.emit("canvas:event", {
                eventType: event,
                data: data
            });
        };
    }(e));
}
for (e in CanvasIO.events) {
    CanvasManager.canvas.on(e, function(event, data){
        CanvasIO.socket.emit("canvas:event", {
            eventType: event,
            data: data
        });
    }.bind(null, e));
}