2013-02-19 81 views
1

我相信我根本沒有足夠的咖啡可以清楚地看到,而且這看起來很平凡,但是,我有一個for循環,它在jQuery插件中傳遞了一些函數。 var i被傳遞,並且當然傳遞了i的最後一個值,而不是它在通過時分配的值。Javascript「for loop」變量指針

for (var i = 1; i < 3 + 1; i++) { 
    $('#div' + i).plugin({ // i returns correctly here 
    onDelete: function() { 
      alert("Deleting #" + i); // i returns 4 every time - last value of i 
     } 
    }); 
} 

我該如何「複製」我,所以它是按照我的預期返回?我有一個解決方法,但我很想知道,所以我可以把我的頭放在沙子裏。

回答

6

這是一個衆所周知的循環問題。每一次都必須將其包裝在一個封閉:

for (var i = 1; i < 4; i++)(function(i) { 
    $('#div' + i).plugin({ 
     onDelete: function() { 
      alert("Deleting #" + i); 
     } 
    }); 
})(i); 

或者您可以使用此:

for (var i = 1; i < 4; i++) { 
    $('#div' + i).plugin({ 
     onDelete: callback(i) 
    }); 
}; 

function callback(i) { 
    return function() { 
     alert("Deleting #" + i); 
    }; 
} 
+0

甜。我不敢相信我沒有想到這一點。帖子(i)究竟做了什麼? – 2013-02-19 14:34:16

+0

@ MichaelC.Gates它被稱爲[immediate-invoked function expression](http://stackoverflow.com/questions/8228281/what-is-this-construct-in-javascript)(或IIFE)。 '(i)'部分正在用參數'i'調用函數。你應該考慮使用我的最後一個,因爲它是 更容易理解。 – 0x499602D2 2013-02-19 14:35:46

+0

我的意思是最後一行})(i);.你的鏈接爲我清除了它。 Thx再次。 – 2013-02-19 14:37:09