2012-08-15 63 views
3

到目前爲止,我已經學會了使用此功能的好處(被它包裹?)故障與(函數(){})()

所以,它幾乎就像命名空間。 假設我們有:

(function() { 

    function foo(){ 
     alert(true); 
    } 

    foo(); //alerts true 

})(); 


(function() { 

    function foo(){ //the same title of the function as above 
     alert("another call of foo"); 
    } 

    foo(); //alerts, ok. 

})(); 

而且我發現它可以訪問公共瓦爾,就像這樣:

var __foo__ = 'bar'; 

(function() { 

    alert(__foo__); //alerts bar 

})(); 

我有一個關於這個方法

我已經試過幾個問題:

  1. 使用必應的教程(我發現他們,但他們中的許多人不回答我的問題)
  2. 播放與傳遞對象進入人體
  3. 在這裏找到答案

但是,我還是打我的頭撞在牆上

所以問題是:

我已經看到人們將對象作爲參數傳遞,但是什麼時候纔有意義? 例如,這是什麼意思?

  1. (function(window) { 
    
    
    })(document); 
    
  2. 我看到水木清華這樣的jQuery用戶界面庫

    (function($) { 
        //some code of widget goes here 
    })(Jquery); 
    

這使得功能外內碼可見的,對不對? (不知道)爲什麼,這是因爲 我們可以訪問對象(比如我們有「模式」窗口小部件),只需調用它,

,如:

$(function(){ 

    $("#some_div").modal(); //here it's object the we got from the function 
}); 

而第二個問題是:如何它工作嗎?

+0

有什麼問題嗎?正如標題所示,您是否遇到了「(function(){})()'的實現問題?或者你只是問它如何工作以及何時使用它? – MrOBrian 2012-08-15 19:01:24

+0

@MrOBrian那麼,我有這兩個問題。 – Yang 2012-08-15 19:02:32

回答

1

主要有2個目的通過在窗口和下方觀察

(function(window, document){ 
    // code 
}(window, document); 
  1. 的JavaScript可以更快地訪問本地變量比全局變量的文檔對象,。這種模式實際上使局部變量名稱爲windowdocument而不是全局變量,從而使腳本稍快。
  2. 使這些名稱局部變量有另一個好處:縮小器可以重命名它們。因此,如果您縮小上述腳本,則window的本地版本可能會重命名爲a,並且document可能會重命名爲b,從而縮小縮小的腳本。如果您將它們作爲全局變量引用,則這些重命名是不可能的,因爲這會破壞您的腳本。

欲瞭解更多信息,結帳這些真棒視頻

  1. http://paulirish.com/2010/10-things-i-learned-from-the-jquery-source/
  2. http://paulirish.com/2011/11-more-things-i-learned-from-the-jquery-source/
2

我見過人們將對象作爲參數傳遞,但是什麼時候纔有意義?例如,這是什麼意思?

(function(window) { 
})(document); 

不治療參數的語言立刻打電話功能不同於參數等功能。

只要您希望在函數體中爲本地名稱輸入一個參數,就可以使用參數。在這種情況下,有點令人困惑,因爲windowdocument可能會被混淆。


(function($) { 
    //some code of widget goes here 
})(Jquery); 

這使得內碼的功能外可見的,對不對?(不知道)爲什麼,這是因爲我們可以訪問對象(說我們有「模態」窗口小部件),只需調用它,

不,它本身沒有任何代碼部件外部可見。這只是一個參數定義,它爲全局變量提供了一個新的局部名稱&。

什麼使內碼可見外側將其連接到外部物體如

$.exportedProperty = localVariable; 

這在jQuery代碼共同約定。

1

關於第一個問題,我不認爲你看到的窗口和文檔,但更多的東西一樣:用像任何函數參數

(function(doc) { 
    var fubar = doc.getElementById("fubar"); // === document.getElementById("fubar") 
})(document); 

你有一個自我調用函數(或關閉):

var b = function(str) { alert(str); } 
b('hi there') //alert('hi there'); 

與上面的代碼一樣,但我們只是一次調用該方法,我們創建它。

其他代碼,您有:

(function($) { 
    //some code of widget goes here 
})(Jquery); 

是預留梅託德來引用jQuery對象內部的$變量,這是非常方便的,如果你有更多的框架或用別的東西代替了$對象,該方法中的所有內容都將使用$來引用jQuery對象,而不是其他任何東西(如果不在代碼中替換它)。

代碼:

$(function(){ 
    $("#some_div").modal(); //here it's object the we got from the function 
}); 

呼籲jQuery和其$(document).ready

一個快捷方式,它會調用該方法:儘快

function(){ 
    $("#some_div").modal(); //here it's object the we got from the function 
} 

爲DOM就緒

1

該模式被稱爲封閉。這是有道理的,當一個模塊或功能的使用方法:

  1. 要避免污染全局作用域變量
  2. 要避免使用全局作用域的變量,並避免其他代碼污染他們

對於例如,每個的,第一藉此圖案:

封閉內部
(function(window) { 
    // ... 
})(window); 

一切都將能夠使用窗口就好像它是一個局部變量。

接下來,使用jQuery符號採取相同的模式:

(function($) { 
    // ... 
})($); 

如果你有一些代碼依賴於像$符號/命名空間,而是另一種模塊重新分配的是,它可以搞砸了你的代碼。通過允許您將符號注入閉包,使用此模式避免了這種情況。

1

無論何時將參數傳遞給該包裝函數,都不會讓您的應用程序中可能存在的任何其他庫或全局變量搞砸。

例如,你可能知道jQuery使用$爲自稱的象徵,你也可能有另一個庫,也將使用$調用itselt,在此條件下,你可能會遇到麻煩引用您的庫。所以你會解決這個問題是這樣的:

(function($){ 
// here you're accessing jQuery's functions 
$('#anything').css('color','red'); 
})(jQuery); 

(function($){ 
    // and in here you would be accessing the other library 
    $.('#anything').method(); 
})(otherLibrary); 

這時候你正在做的jQuery或任何其他類型庫的插件是特別有用的。

1

它的功能是允許您在函數中使用$變量代替jQuery變量,即使$變量被定義爲函數外的其他內容。

舉個例子,如果您同時使用jQuery和原型,你可以使用jQuery.noConflict()確保原型的$仍然在全局命名空間訪問,但你自己的函數裏面,你可以使用$指jQuery的。