有人能向我解释为什么JSLint的抱怨“内循环功能”这个例子:循环内的JavaScript函数
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 linters一样好?
第二个示例将我与回调绑定。第一个不是。在第一个例子中,你的所有i值都等于n。第二个将有0到n-1。 – mithunsatheesh 2014-10-02 03:44:53
@mithunsatheesh - 再看一遍。第一个是IFFE,并执行相同的绑定。 – 2014-10-02 03:47:57
这只是jsLint提供的不足警告。人们给予的警告比应得的更多。它可以警告你不应该做的事情,但它警告的事情不是问题,甚至是必须改变的东西。 – jfriend00 2014-10-02 03:52:01