可能重複:
What do parentheses surrounding a JavaScript object/function/class declaration mean?將函數放在括號中會發生什麼?
我看到裏面的jQuery插件之類的括號功能。
例如,
(function(args) {
// ...
})(localVariable);
這是什麼做的,到底是什麼?
可能重複:
What do parentheses surrounding a JavaScript object/function/class declaration mean?將函數放在括號中會發生什麼?
我看到裏面的jQuery插件之類的括號功能。
例如,
(function(args) {
// ...
})(localVariable);
這是什麼做的,到底是什麼?
你的意思是像下面?:
這基本上確保了任何「VAR」聲明保密(他們範圍限制在他們被放置匿名函數),而不是全球性的。例如,考慮:
var counter = 0;
window['inc'] = function() {
return counter++;
};
與
(function() {
var counter = 0;
window['inc'] = function() {
return counter++;
};
})();
這些都具有定義一個函數window.inc
返回一個計數器,獲得遞增的效果;但是,在第一個版本中,counter
實際上對所有其他模塊都可見,因爲它位於全局範圍內,而後者確保只有window.inc
才能訪問counter
。
請注意,代碼創建一個函數並立即調用它(這是最後一個parens的用途)。
非官方名稱是一個'直接函數' - 基本思想是該函數被定義並即時調用。
這裏有一個簡單的例子:
http://javascriptmountain.com/2011/06/functions/immediate-functions-in-javascript-the-basics/
括號實際上是沒有必要的,除非該函數的返回值賦值給變量,但它們通常用於可讀性。
它在jQuery插件之類的情況下完成的原因是它爲執行代碼提供了一種「沙盒」。假設我們做了以下內容:
(function($) {
// augment $ with methods
}(jQuery));
此定義一個函數,它在一個參數,然後立即調用該函數,通過在全球jQuery對象。在直接函數中聲明和使用的任何變量都將在本地作用於該函數,並且不會干擾全局作用域或破壞可能已在其他正在使用的JavaScript代碼片段中聲明的全局變量(對於旨在用於與大量的其他代碼一起使用)。但是,由於我們在調用函數時傳遞了全局jquery對象,我們仍然可以將方法和屬性添加到函數內部的'$'參數,該函數將在函數完成後掛在jquery對象上。
希望這會有所幫助!
我很確定我知道你在說什麼,但發表一個例子會讓這個問題更有價值。 – deceze
謝謝,我投票結束 - 那裏有很好的答案。 –