【发布时间】:2014-11-27 01:09:33
【问题描述】:
谁能用这个例子向我解释为什么 JSLint 抱怨“循环内的函数”:
for (var i = 0; i < buttons.length; i++) {
(function(i) {
buttons[i].onclick = function(e) {
t.progressBars[t.current].update(buttons[i].getAttribute("data-value"));
}
})(i);
}
但是当我把它改成:
function makeHandler(i)
{
return function() {
t.progressBars[t.current].update(buttons[i].getAttribute("data-value"));
}
}
for (var i = 0; i < buttons.length; i++) {
buttons[i].onclick = makeHandler(i);
}
我不太明白,因为似乎每次循环迭代都必须返回新的函数对象,即使它发生在 makeHandler() 函数内部。为什么第二个例子可以用 JS linter?
【问题讨论】:
-
第二个示例将 i 与回调绑定。第一个没有。在第一个示例中,您将拥有所有 i 值等于 n。其中第二个将有 0 到 n-1。
-
@mithunsatheesh - 再看一遍。第一个是 IFFE 并且执行相同的绑定。
-
这只是 jsLint 的一个信息不足的警告。人们对它的警告给予了比它应得的更多的信任。它可以警告你不应该做的事情,但它警告的一切都不是问题,甚至不一定是应该改变的事情。
-
@TedHopp:天哪。我错过了什么吗? see this fiddle。不绑定。
-
@mithunsatheesh - 你是在提醒号码
1,而不是i。这没有显示任何内容。
标签: javascript function jslint