2009-07-31 7 views
8

Meine Abfrage wird in Fällen verwendet, in denen "(function() {...})();" Da ich kein Plugin bin. Zum Beispiel "http://piecesofrakesh.blogspot.com/2009/03/downloading-javascript-files-in.html"Wann sollte ich die Syntax "(function() {...})();"?

(function() {   
    var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
    ]; 

    var sc = "script", tp = "text/javascript", sa = "setAttribute", doc = document, ua = window.navigator.userAgent; 

    for(var i=0, l=s.length; i<l; ++i) { 
    if(ua.indexOf("MSIE")!==-1 || ua.indexOf("WebKit")!==-1) { 
     doc.writeln("<" + sc + " type=\"" + tp + "\" src=\"" + s[i] + 
      "\" defer></" + sc + ">"); 
    } else { 
     var t=doc.createElement(sc); 
     t[sa]("src", s[i]); 
     t[sa]("type", tp); 
     doc.getElementsByTagName("head")[0].appendChild(t); 
    } 
    } 
})(); 

Oder

var s = [ 
    "/javascripts/script1.js", 
    "/javascripts/script2.js" 
]; 
... 

Danke.

+9

Was ist genau die Frage? – Scoregraphic

+8

"Da ich kein Plugin bin" ist süß :-) – balpha

+0

Sorry, ich schreibe sehr schlecht auf Englisch. Das Skript ist kein Plugin, in diesem Fall ist es nützlich, diese Struktur zu verwenden "(function() {...}();" –

Antwort

24

Dies wird getan, um Namenskonflikte zu vermeiden.

Wenn Sie eine Funktion deklarieren, hat diese Funktion einen eigenen Namensraum für Variablen. Wenn Sie den Code in eine Funktion einfügen, die sofort aufgerufen wird, vermeiden Sie das Überschreiben globaler Variablen mit Ihren eigenen Werten.

In diesem Fall wird s und sc ein Wert zugewiesen. Wenn Sie dies im globalen Gültigkeitsbereich getan hätten und andere Skripts bereits Variablen mit diesen Namen für einen anderen Zweck verwendet hätten, würden diese anderen Skripts fehlschlagen. Durch die Einführung des neuen Gültigkeitsbereichs verweisen die Bezeichner s und sc nun auf andere (lokal gebundene) Variablen als die Variablen s und sc, die im globalen Gültigkeitsbereich existieren.

+0

Vielen Dank für Ihre Antwort –

+3

+1 für die Wünschbarkeit der Frage von ... – Kip

2

Idiom (function() {...})(); Grenzen Umfang Ihrer Variablen. Also im ersten Fall s (und sc, tp usw.) ist nicht zugänglich außerhalb des Funktionskörpers. Im zweiten Fall können Sie darauf zugreifen. So (function() {...})(); hält Sie von Namespace Verschmutzung. Ob Sie das brauchen, ist eine andere Frage. Sie können gerne etwas wie "scope javascript" googeln. Es gibt eine nette article.

+0

Vielen Dank für Ihre Antwort –

3

(function() {...})(); ist eine selbstaufrufende anonyme Funktion, d.h. eine Funktion ohne Namen, die sofort ausgeführt wird. Da JavaScript über einen Funktionsumfang verfügt, schränkt die Verwendung von selbstaufrufenden anonymen Funktionen den Gültigkeitsbereich von Variablen innerhalb der Funktion auf die Funktion selbst ein, wodurch Konflikte vermieden werden, die ansonsten auftreten könnten.

In jQuery wird eine selbstaufrufende anonyme Funktion häufig von Plugin-Authern verwendet, um das jQuery-Objekt mit dem $-Symbol innerhalb der Funktion zu referenzieren. Zum Beispiel

(function($) { 

    /* plugin code here */ 

})(jQuery); 
Verwandte Themen