我可以将"new"匿名函数传递给addEventListener

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)

Luc*_*eis 5

你需要这样做:

addCrossEvent(linkTags[i], "mousedown", 
      (function(i) {
          return function(evt) {
              activeVisual(evt, linkTags[i]);
          }
      )(i);
);
Run Code Online (Sandbox Code Playgroud)

问题在于迭代器变量i在每次迭代时都会发生变化,并且传递了它的引用,i不会复制值.将此方式作为参数传递给包装函数将导致复制,并且它将在该特定迭代时接收实际值.