包裝該函數的()
將匿名函數聲明轉換爲函數表達式,然後可以立即使用表達式後面的()
調用函數表達式。
在這種情況下,外部()
確實沒有必要,因爲var foo =
會將它轉換爲表達式。此外,foo
的值將爲undefined
,因爲函數調用不會返回任何內容。
它可以用來創建一個新的變量作用域,因爲函數是在javascript中完成該操作的唯一方法。 (Javascript沒有塊範圍。)
因此someVar
變量不能被外部範圍訪問。有時可能需要以受控方式訪問它。要做到這一點,你可以通過引用someVar
的範圍傳遞一個函數。然後,在函數調用退出後,其執行上下文將保持不變,並且someVar
將以您傳遞的函數提供的任何方式可用。
這就是所謂的創建closure
。
假設您將一個值傳遞給調用,並將其分配給someVar
。然後您可以調用foo
變量中的一個函數return
。如果該函數返回引用someVar
,那麼您可以使用該函數來獲取其值。
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function() {
alert(someVar);
};
})('somevalue');
foo(); // alerts 'somevalue'
正如你可以看到,現在foo
仍然可以訪問someVar
引用的函數。
假設您改變了它,以便返回到foo
的函數可以接受參數,該參數將更新myVar
的值。
var foo = (function (str) {
var someVar = str;
/*
function someFunc() {
return true;
}
*/
return function(n) {
if(n) {
someVar = n;
} else {
alert(someVar);
}
};
})('somevalue');
foo(); // alerts 'somevalue'
foo('newvalue'); // give it a new value
foo(); // alerts 'newvalue'
現在你可以看到,在foo
功能確實訪問該變量,因爲它是能夠改變它的值,並參考其先前設置的新值。
另外http://stackoverflow.com/questions/4531110/jquerys-function-jquery-syntax/4531124#4531124 – 2011-01-07 02:21:05