0

我有一个像这样在for循环中声明的jquery click函数

for (i = 1; i !== 4; i += 1) {
    id = "index" + i + "id";
       if ($(id).length) {
          $(id).click(function() {
             var isChecked = this.checked;
             onclickHelper(isChecked, this.id);
          });
       }
}

我将如何摆脱在循环中创建函数的警告?第二个为什么不好(jslint 给我这个警告)

4

4 回答 4

1
var $ids = $();
for (var i = 1; i < 4; i++)
    if($("#index" + i + "id").length)
        $ids = $ids.add("#index" + i + "id");

$ids.click(function () {
    var isChecked = this.checked;
    onclickHelper(isChecked, this.id);
});
于 2013-06-20T16:49:21.407 回答
1

SLaks 是正确的,并且遵循该建议的最小重构(没有具体讨论这里发生的事情的优点)如下所示:

/*global $, onclickHelper */
var i, id, fnCached;

// cache your function instead of creating each time in your loop
fnCached = function() {
    var isChecked = this.checked;
    onclickHelper(isChecked, this.id);
};

for (i = 1; i !== 4; i += 1) {
    id = "index" + i + "id";
    if ($(id).length) {
        $(id).click(fnCached());  // then simply call it
    }
}

正如他所说,JSLint 只是希望您更有效地运行事物,并且由于您可以将函数缓存在变量中,因此在循环之外但在相同的范围和poof中声明,您就完成了。

巧妙的是,“因为”提升,如果你i在函数中使用并fnCached在循环之前声明,上下文“旅行”就像你在循环中声明一样,所以这个快速缓存技巧几乎总是有效的(尽管如果声明更进一步的范围确实有意义,那就去做吧)。

/*jslint browser: true */
this.spam = "spam";

var i, fnCached;

fnCached = function () {
    // i's scope pervades the snippet here
    window.alert(this.spam + " " + i);
};

for (i = 0; i < 3; i += 1) {
    fnCached();
}

这样会提醒“垃圾邮件 0”、“垃圾邮件 1”和“垃圾邮件 2”。

小提琴

于 2013-06-21T00:40:50.630 回答
1

在没有循环的情况下尝试这样的事情,

$("[id=^'index']").click(function() {
     var isChecked = this.checked;
     onclickHelper(isChecked, this.id);
});
于 2013-06-20T16:42:22.000 回答
1

每次执行表达式function() { ... }(我不是指调用函数)时,Javascript 都会为函数创建一个单独的闭包。
这不必要地浪费内存。

它还诱使您犯错误,例如i在函数中使用(由于 Javascript 没有块作用域,这不会按您期望的方式工作)。

相反,您应该将函数放在循环之外——只创建一次,并将其存储在一个变量中——然后将相同的函数实例添加到每个元素。

于 2013-06-20T16:38:33.453 回答