在這個例子中,沒有區別。在這兩種情況下,anotherFn
立即執行。
但是,當在循環中創建函數時,通常使用立即函數。
考慮這個例子(或多或少的僞代碼):
for(var i from 1..10) {
elements[i].onclick = function() {
alert(values[i]);
}
}
如JavaScript有唯一的功能範圍,沒有塊範圍,所有的事件處理程序共享相同i
,之後將具有值10
循環完成。所以每個處理程序都會嘗試提醒values[10]
。
通過使用直接函數,一個新的範圍被引入其中「捕獲」循環變量的當前值:
for(var i from 1..10) {
(function(index) {
elements[i].onclick = function() {
alert(values[index]);
}
}(i));
}
由於這是有時難以閱讀,創建一個單獨的函數,其返回另一個功能往往是更好的:
function getHandler(value) {
return function(){alert(value);};
}
for(var i from 1..10) {
elements[i].onclick = getHandler(values[i]);
}
這是一個很好的例子! – Rudie 2011-05-03 18:44:42
當我嘗試使用(var i from 1..10)時出現語法錯誤{} – 2012-01-23 02:03:02
@cf_PhillipSenn:是的,它不是JavaScript。請注意,我寫了*「考慮這個例子(或多或少的**僞代碼**):」* – 2012-01-23 09:12:58