2016-11-25 3 views
4

Ich versuche, den Unterschied zwischen zu verstehen:Selbst rufenden anonymouse Funktionen mit Dokument Parameter

(function(document) { 
    //do stuff with document 
})(document); 

und

(function() { 
    //do stuff with document 
})(); 

Ich bin mir nicht sicher, warum die Konvention zu sein scheint document und manchmal passieren window auch auf die Funktion? Hat das mit dem Umfang zu tun?

Antwort

1

Es gibt einige Gründe dafür:

1. Mit weniger globale Variablen Durch die Funktion mit der globalen Variablen Injizieren es nur auf dem Argument und nicht um eine globale Variable abhängen, die mehrfach verwendet werden könnten .

2. Erstellen eines lokalen Bereichs Ein IIFE ist eine Möglichkeit, einen neuen Bereich zu erstellen, indem eine Funktion deklariert und sofort aufgerufen wird. Weitere Informationen finden Sie unter this question.

3. Bessere minify

Zum Beispiel, wenn Sie Ihr Beispiel wird minify wird es aus dieser Änderung:

(function(document) { 
    //do stuff with document 
})(document); 

Um dies:

(function(a) { 
    //do stuff with a 
})(document); 

Beachten Sie die a, die ist kürzer als Ihre document.

Edit: Feste Tippfehler

+0

Nützlicher Link. Ich fand das, was dies für mich beantwortet: "Leistungsvorteil der Verwendung von IIFEs ist die Fähigkeit, häufig verwendete globale Objekte wie Fenster, Dokument usw. als Argument zu übergeben, indem die Scope-Suche reduziert wird. (Denken Sie daran, dass JavaScript nach Eigenschaften im lokalen Bereich sucht) bis zum globalen Gültigkeitsbereich). Der Zugriff auf globale Objekte im lokalen Bereich reduziert die Suchzeit wie folgt. " – tommyd456

6

Dies wird besonders praktisch, wenn Sie einen Kompressor/Uglifier wie UglifyJS verwenden. Es ersetzt dann document mit sagen a, so dass Ihr Code kürzer.

So etwas wie

(function(document, window){ 
    var body = document.body; 
    var foo = document.querySelector('foo'); 
    var bar = document.querySelector('bar'); 
})(document, window); 

wird

(function(a, b){ 
    var c = a.body; 
    var d = a.querySelector('foo'); 
    var e = a.querySelector('bar'); 
})(document, window); 

Wenn Sie nicht Dokument und Fenster in der Funktion platziert haben werden es nur halten Dokument zu sagen;

(function(){ 
    var c = document.body; 
    var d = document.querySelector('foo'); 
    var e = document.querySelector('bar'); 
})(); 
+0

aber wenn Sie stellen kein Dokument ist dann nicht kürzer? – Mahi

+1

() ist kürzer als (a). – victor175

+0

@ victor175 Ja, das ist, was ich fragte ihn auch – Mahi

2

Ein sofort aufrufender Funktionsausdruck (IIFE) erstellt einen neuen lokalen Bereich. Wie bei jeder Funktion können Sie Argumente übergeben, wenn Sie sie aufrufen. document und window sind Globals in JavaScript Web API und werden zur Verfügung gestellt, wenn Sie js im Browser ausführen. Indem Sie sie in ein IIFE übertragen, können Sie auf sie zugreifen, was immer Sie wollen, aufgrund des Umfangs. Zum Beispiel:

(function(w, d) { 
    console.log(w); // window 
    console.log(d); // document 
})(window, document); 

console.log(w); // Uncaught ReferenceError: w is not defined 
console.log(a); // Uncaught ReferenceError: a is not defined 

Der Grund w und a sind nicht in dem zweiten Satz von console.log s definiert ist, weil sie lokal an den IIFE scoped.

+1

Und warum möchte ich sie im lokalen Bereich? – tommyd456

+0

Scope ist ein extrem wichtiges Programmierparadigma. Es verhindert Namenskonflikte und unerwartetes Verhalten. –

Verwandte Themen