Bor*_*nov 1 javascript events arguments anonymous-function
我使用这样的代码将参数传递给事件处理函数.但是,在这种特殊情况下,循环会导致问题.在所有activeVisual调用中只能访问最后一个linkTags [i].这与传递参数的匿名函数对于整个循环是一个相同的事实有关.
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
现在,我记得在匿名函数声明之前尝试添加new,如下所示:
for (var i = 0; i < linkTags.length; i++) {
addCrossEvent(linkTags[i], "click", launchLink);
addCrossEvent(linkTags[i], "mousedown",
new function(evt) {
activeVisual(evt, linkTags[i]);
});
}
Run Code Online (Sandbox Code Playgroud)
那没起效.activeVisual永远不会被调用.有人可以向我解释为什么以及如何让它成功呢?
更新最终解决方案
感谢下面的所有回复,我的工作代码现在看起来像这样:
// Function that provides pass of event handling parameters with separate copy in each loop
function callbackHandler(index) {
return function(evt) {
activeVisual(evt, linkTags[index]);
}
}
...
for (var i = 0; i < linkTags.length; i++) {
...
addCrossEvent(linkTags[i], "mousedown", callbackHandler(i));
}
Run Code Online (Sandbox Code Playgroud)
你需要这样做:
addCrossEvent(linkTags[i], "mousedown",
(function(i) {
return function(evt) {
activeVisual(evt, linkTags[i]);
}
)(i);
);
Run Code Online (Sandbox Code Playgroud)
问题在于迭代器变量i
在每次迭代时都会发生变化,并且传递了它的引用,i
不会复制值.将此方式作为参数传递给包装函数将导致复制,并且它将在该特定迭代时接收实际值.