有人能向我解釋爲什麼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