2011-01-07 70 views
15

可能重複:
What does (function($) {})(jQuery); mean?在JavaScript/jQuery中,括號中的代碼塊是什麼意思?

我已經看到了很多與下面這種語法的jQuery代碼,但我真的不明白是什麼意思。它出現在this answerthis answer關於代碼組織的問題中。兩者都談論命名空間,所以我猜這就是它完成的。

var foo = (function() { 
    var someVar; 

    function someFunc() { 
     return true; 
    } 
})(); 

這是用於命名空間的,它是如何工作的?有時在最後一組圓括號中有一個名稱(名稱空間?),有時不是。兩者有什麼區別?

+1

另外http://stackoverflow.com/questions/4531110/jquerys-function-jquery-syntax/4531124#4531124 – 2011-01-07 02:21:05

回答

14

包裝該函數的()將匿名函數聲明轉換爲函數表達式,然後可以立即使用表達式後面的()調用函數表達式。

在這種情況下,外部()確實沒有必要,因爲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功能確實訪問該變量,因爲它是能夠改變它的值,並參考其先前設置的新值。

7

圓括號環繞一個匿名函數,以使其成爲一個變量,可以通過在其後面添加參數直接調用該變量。

(function(param) { 
    // do stuff 
})(param); 

最後一位不是名稱空間,只是一個參數。你可能已經看到這個曾經的jQuery爲:

(function($) { 
    $('.something').addClass('.other'); 
})(jQuery); 

這樣做是在傳遞jQuery對象的功能,使得$變量jQuery的匿名函數的範圍內的對象英寸人們喜歡使用簡寫$,但它可能會導致與其他圖書館發生衝突。該技術通過將完全合格的jQuery對象寫入並覆蓋該函數範圍內的$變量來消除衝突的可能性,因此可以使用該快捷方式。

相關問題