可能重複:
JavaScript scope and closure爲什麼/在哪裏/何時應該這樣做? (附js代碼的函數裏面,然後執行它)
是什麼呢?
(function(){
//The code to be executed
})();
另外,這有什麼關係?
可能重複:
JavaScript scope and closure爲什麼/在哪裏/何時應該這樣做? (附js代碼的函數裏面,然後執行它)
是什麼呢?
(function(){
//The code to be executed
})();
另外,這有什麼關係?
我最近經常看到它。我猜測:
無需命名該功能。這意味着它不可重用。 這給你一個局部範圍來聲明變量使用var
(否則,你會將它們添加到全局)。
這是一個closure和一個anonymous function - Javascript中的關鍵概念。 Javascript沒有'真正的'私有屬性或字段 - 但使用閉包你可以基本上創建等價物。他們是組織JS的一個非常重要的手段。在此示例中
的一個關鍵點是();
在代碼的最末端 - 添加這些括號讓JavaScript 立即執行代碼 - 有效初始化無論是包含在。
http://www.jibbering.com/faq/notes/closures/
爲了幫助澄清(我不是JS-專家) - 這個構造,即使不是純粹的關閉,常見於與封閉相結合。例如,下面的代碼段(從上面我的鏈接複製)使用以下語法來定義一個內部的,隱藏方法:後這個例子不立即執行(它缺乏();
):
function callLater(paramA, paramB, paramC){
/* Return a reference to an anonymous inner function created
with a function expression:-
*/
return (function(){
/* This inner function is to be executed with - setTimeout
- and when it is executed it can read, and act upon, the
parameters passed to the outer function:-
*/
paramA[paramB] = paramC;
});
}
...
/* Call the function that will return a reference to the inner function
object created in its execution context. Passing the parameters that
the inner function will use when it is eventually executed as
arguments to the outer function. The returned reference to the inner
function object is assigned to a local variable:-
*/
var functRef = callLater(elStyle, "display", "none");
/* Call the setTimeout function, passing the reference to the inner
function assigned to the - functRef - variable as the first argument:-
*/
hideMenu=setTimeout(functRef, 500);
雖然內部函數定義。因此,在這種情況下,所包含的函數將在稍後的時間點進行評估 - 這些函數語言中的這些函數有很大的不同。
它用於運行全局範圍的代碼OUT。 使用此功能,您正在使用功能範圍。在這種情況下,匿名函數的範圍。
例如,當您不想創建全局變量時,這是有用的。
參見:
var b = 2;
(function(){
var a=1;
alert("a:" + a); // alerts 1
alert("b:" + b); // alerts 2
})();
alert("OUT b:" + b); // alerts 2
alert("OUT a:" + a); // undefined
見jsfiddle。
編輯:
語法()()
是另一種方式來調用一個函數。 見
alert(1); // alerts 1
(alert)(2); // alerts 2
見jsfiddle。
感謝您對另一種調用技巧的編輯()()...我似乎無法找到任何只是簡單陳述它的地方! – exoboy 2014-09-18 17:18:34
它是一種定義函數並立即調用它的方法。那是什麼最後();確實。
正如您所說,封閉是JavaScript中的一個關鍵概念。但實質上是保留或避免引用屬於訪問它們的函數的執行上下文的變量。這裏的事情是沒有任何變數,而且這畢竟不是問題的要點。我沒有在其原始上下文之外訪問任何變量。所以..,這裏有什麼關閉?我認爲合適的一個downvote(「答案沒有用」)。如果你願意,我可以把它拿出來,但你的答案與其餘的幾乎沒有什麼共同之處。 – DanC 2010-08-31 19:08:53
「沒有任何變量」。 - 在這個例子中沒有任何東西,我推測你正在研究的情況可能包含變量和其他函數等成員,導致它作爲閉包。這是我很少看到的簡單腳本/程序Javascript – STW 2010-08-31 19:19:57
抱歉STW,我不是故意粗魯,但是,您是否看到其他回覆?你可以整天爭論,但在這一點上,我已經問過(看到所有其他答案),看起來很清楚,而你的回答恰恰不合適。這實際上是我沒有找到的另一個問題的完全重複。無論如何感謝你的回答,但你的回答可能更適合另一個問題,也許關於關閉。此外,你的答案似乎已經改變了很多,因爲你原來的答案。 – DanC 2010-08-31 19:51:10