2011-05-03 99 views
3

我讀了關閉結尾處的()會立即執行它。那麼,這兩者有什麼區別。我在一些代碼中看到了第一個用法。Javascript關閉

謝謝。

for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){ 
     (function(val){ 
      anotherFn(val); 
     })(a[i]); 
} 

for (var a=selectsomeobj(),i=0,len=a.length;i<len;++i){ 
      anotherFn(a[i]); 
} 

回答

14

在這個例子中,沒有區別。在這兩種情況下,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]); 
} 
+0

這是一個很好的例子! – Rudie 2011-05-03 18:44:42

+0

當我嘗試使用(var i from 1..10)時出現語法錯誤{} – 2012-01-23 02:03:02

+0

@cf_PhillipSenn:是的,它不是JavaScript。請注意,我寫了*「考慮這個例子(或多或少的**僞代碼**):」* – 2012-01-23 09:12:58

1

第一個定義了一個self-invoking function(它依次執行一個函數),第二個函數只執行該函數。在這兩種情況下,傳遞給該參數的參數都是[i]。

+0

效果的任何區別..或程序行爲相同? – bsr 2011-05-03 18:39:00

+0

我添加了一個鏈接來解釋自調用函數 - 在這種情況下,沒有理由使用它。 – hvgotcodes 2011-05-03 18:41:11

+0

不,在這種情況下,沒有區別,因爲封閉幾乎是空的。 – Rudie 2011-05-03 18:42:27

3

在您的示例中的兩個實例中,值都執行相同的操作。還有其他一些例子,如果您不小心使用第一種方法(使用自動執行匿名函數),則i的值將遞增並且不會正確傳遞到您的函數。

這裏有一個指南,向下滾動到中環的創建關閉:一個常見的錯誤部分,看問題:

https://developer.mozilla.org/en/JavaScript/Guide/Closures