差異:
第一個執行匿名函數表達式:
(function() {
//some code here, angular code
})();
第二個不執行它:
(function() {
//some code here, angular code
});
是沒有名稱的函數。
背景:
基本上,我們首先與(__function_declaration__)
包裹匿名功能聲明,使之成爲功能表達:
// this is a function declaration:
function() {
//some code here
}
// this is a function expression
(function() {
//some code here
});
它本身什麼都不做因爲我們既沒有執行它,也沒有在當前範圍內聲明它。換句話說,它是無用的。瞭解更多關於difference between function declaration & function expression。
現在,我們可以使用函數表達式作爲參數傳遞給其他一些功能,如jQuery不會:
// now jQuery is taking the function expression as parameter
$(function() {
//some code here
});
或者,我們可以通過在最後使用()
執行本身的功能(這是我們如何調用任何實際功能 - 在這種情況下,不帶任何參數):
// Now the function expression gets executed.
(function() {
//some code here, angular code
})();
這也被稱爲Immediately-Invoked Function Expression or IIFE。
上面的例子沒有任何參數。但是,如果你有一個參數,你可以通過它像這樣在執行:
(function (c) {
// Here c.log() is same as console.log()
c.log("hello");
})(console);
注:我已經添加了參數的例子,因爲它可能是不帶任何參數不太明顯。
最佳實踐:
由於功能上它們是不同的,最佳實踐的問題不會出現。通常我們使用IIFE的情況下,我們想要執行的東西在一個範圍不同於當前範圍&我們不想在當前範圍內留下任何足跡的函數聲明,變量聲明等。
延伸閱讀:
更多關於這個討論可以發現here,here,here和here。
#2不會被調用 – charlietfl