2009-09-28 81 views
1

IM希望有人能解釋的JavaScript以下使用...簡單的javascript問題?

我有一個頁面,它有一個腳本標記在它和內容如下所示

(function($){ 
    // code 
    // and stuff 
})(jQuery); 

IM只是想了解這是什麼一樣爲主,

  1. 左括號在開始
  2. $符號的使用
  3. 在括號中的jQuery結尾

謝謝!

回答

5

這是一個匿名函數。

您提供的具體示例通常在jQuery(使用「$」)與另一個庫(原型也使用「$」)衝突時使用。

這樣做是說,只要在函數中使用「$」,就是引用jQuery對象。

正常:

$("foo").doStuff() 

避免衝突:

jQuery("foo").doStuff() 

使用匿名函數來避免衝突:

(function($){ 
    $("foo").doStuff(); 
})(jQuery) 
+0

突然之間有道理,謝謝! – Matt

2

在最高級別,它聲明一個函數並在同一語句中調用它。

讓我們把它分解成各個組成部分:

首先,我們可以在一個函數中使用$作爲參數/變量名,就像別的:

function foo($) 
{ 
    alert($); 
} 

foo('hi'); //alerts 'hi' 

其次,我們可以指定一個函數到一個變量:

var foo = function($) { 
    alert($); 
} 

foo('hi'); //alerts 'hi' 

最後,我們不必給函數名稱 - 我們可以聲明它們。我們將它們包裝在括號封裝整個函數聲明爲VAR,我們然後調用(就像上圖):

(function($) { 
    alert($); 
})('hi'); 

在你的情況,jQuery被傳遞到函數作爲$參數某些對象。可能是jQuery庫的根對象,所以你可以調用它的功能。

-1

讓我們先來看看內部函數聲明:

function($){ 
    // code 
    // and stuff 
} 

這是一個匿名函數聲明,其中一個參數名爲$。然後將該函數包裝在圓括號中,並使用jQuery作爲參數,將(jQuery)附加到括號中。

0
  1. 括號包裹的匿名功能,因此它可以被稱爲與參數是jQuery的

  2. $參考馬上在JavaScript中一個有效的變量名,所以很多框架使用它的簡潔。通過在這裏包含它作爲函數參數,你說你想用$作爲jQuery的別名。這可以讓您的代碼儘可能短,並節省用戶的帶寬。

  3. 回答第一部分 - 你發送一個參考jQuery對象/框架將匿名函數。

0

簡言之:

這聲明它接受一個參數的匿名函數,由$的局部變量名錶示,並然後立即調用傳遞作爲第一個參數jQuery對象的功能。

減簡述:

在JavaScript函數聲明如下

函數foo(ARG1,ARG2){

}

後來foo函數可以調用:

foo(「arg 1」,「arg 2」);

但是在javascript函數中是一等公民;如果你願意,你可以在一個變量中存儲一個函數。當這樣的變量名是函數的名字,所以你寫這樣的:

變種富=功能(ARG1,ARG2){

};

尾隨分號是必需的,因爲變量聲明(和賦值)是一個語句。後來,函數foo可以被稱爲:

FOO( 「ARG 1」, 「ARG 2」);

這裏的好處是,你可以通過該功能到另一個功能,或將其存儲在一個陣列,或什麼的。這類函數被稱爲匿名函數(因爲它們沒有函數名稱)。

裏面的匿名函數foo,如上面看到的,你可以聲明其保留withing該功能的範圍,並在該函數被聲明範圍不存在局部變量。例如,本地arg1和arg2變量不存在於變量foo的作用域中(但它們確實存在於foo中存儲的匿名函數中)。

這一招使我們能夠創造我們管什麼事情,而不必擔心踏着別人的命名空間被命名爲專用塊。

你可以寫你所提供的示例如下:

變種富=函數($){

}; fn(jQuery);

這是同樣的事情,但有那個醜陋的中間變量。不明顯的是,匿名函數的聲明「返回」一個函數引用,可以稍後調用......或者同時添加()的函數調用語法。

代碼正在做的是定義一個匿名函數,它創建一個私人範圍,然後立即調用它而不存儲在一個變量中。像這樣:

功能(ARG1){

}( 「ARG 1」);

我不完全確定爲什麼有一個額外的圓括號集合匿名函數定義,但他們至少使代碼更具可讀性/邏輯性。你只是傳遞參數到括號表達,這恰好是一個函數的結果:

(函數(ARG1){

})( 「ARG 1」);

所有的tQuery都允許jQuery擁有一個名爲jQuery的全局範圍變量,但也允許用戶使用$的簡寫而不會與其他使用相同名稱的javascript框架衝突。