不使用匿名函数的循环内的闭包 - javascript

时间:2016-09-08 20:04:57

标签: javascript closures

在用JSHint绘制我的代码之后,它提出了一个建议,不要在for循环中创建新函数,如下所示:

for (var i = 0; i < AnArray.length; i++){
    // code that creates an element
    (function(_i) {
        element.addEventListener(
            "click",
            function() { DoSomething(_i); }
        );
    })(i);
}

DoSomething(arg)执行与该Array实体相关的操作。我尝试过如下代码,没有运气。

function RegisterClick (elem, i) {
    elem.addEventListener(
        "click",
        function() { DoSomething(_i) }
    )
}

for (var i = 0; i < AnArray.length; i++){
    // code that creates an element
    (RegisterClick (_elem, _i)) (element, i);
}
  1. 从长远来看,这是我应该担心的吗?
  2. 有没有办法不创建新功能但是可以获得闭包的好处?

1 个答案:

答案 0 :(得分:2)

  

我尝试过如下代码,没有运气。

您过度思考代码。你的括号太多了。你只需要调用该函数。返回值为undefined,您不需要调用它。您还需要保持变量名称。

function register_click(elem, i) {
    elem.addEventListener(
        "click",
        function() { DoSomething(i) }
    );
}

var _elem = something_that_gets_an_element();

for (var i = 0; i < an_array.length; i++){
    register_click(_elem, an_array[i]);
}
  

从长远来看,这是我应该担心的吗?

单独创建函数可以使代码更清晰,更易于阅读。它具有较少的嵌套范围,因此更容易跟踪哪个变量。

  

有没有办法不创建新功能但获得闭包的好处?

您可能正在寻找at the end of this answer所述的let