Global, Superglobal, Initialisierung, "(function(){" was bedeutet das

SonicBe@m

Erfahrenes Mitglied
Hallo zusammen,

ggf. kann mir einer erklären was dieses Konstrukt bedeutet.

Es gibt gerade wenn man mit Frameworks wie jQuery oder Dojo arbeitet folgende notation in Javascript files.

Code:
(function(){
GLOBALS = {What:'inLeft'}
}();

Kann mir einer sagen was das bedeutet und wie man auf sowas zugreifen kann?
Das Globals an dieser stelle ein JSON Objekt wird, ist mir klar aber was hat es mit diesen (function() zeug am Anfang aufsich?

Ich kann auf nichts zugreifen.
das selbe Spiel gibt es wenn ich mich nicht ganz irre auch z.b. mit

Code:
$(function(){
.....
}();

Hier würde ich denken das die methode $ mit nachfolgendem Inhalt aufgerufen wird, sprich das wäre eine initialisierung.
Wenn aber nun diese Methode durch ist dann sind auch die Variablen nichtmehr sichtbar und meiner meinung nach auch nichtmehr zugreifbar.

das ich eine Methode folgend erstellen kann ist mir durchaus bewusst.

Code:
var meinObj = function(){
lala = function(blub){
alert(blub);
}
 };
meinObj.lala('lol');

aber das oben erwähnte verstehe ich nicht und finde hierzu auch nicht wirklich was.

viele Grüße
Stephan
 
Hi,

bei
Code:
function(){
  // Anweisungen
  GLOBALS = {What:'inLeft'};
}
handelt es sich um eine anonyme Funktion.

Wird diese in runde Klammern gesetzt, handelt es sich um ein Funktionsobjekt, dass wie gewohnt aufgerufen werden kann. Da die Variable GLOBALS ohne das Schlüsselwort var deklariert wird, ist sie global verfügbar und es kann nach der Ausführung der Funktion auf ihren Inhalt zugegriffen werden.
Code:
(function(){
  GLOBALS = {What:'inLeft'};
})();

alert(GLOBALS.What);

Solltest du mit dem zweiten Teil deiner Frage auf jQuery abzielen, so sei angemerkt, dass es sich bei
Code:
$(function(){
  // Anweisungen
  GLOBALS = {What:'inLeft'};
});
um einen Shortcut (Kurzanweisung) für
Code:
$(document).ready(function(){
  // Anweisungen
  GLOBALS = {What:'inLeft'};
});
handelt. Es ist ein Eventhandler, der nach dem Laden des DOM ausgeführt wird (entspricht dem onload-Event). Die Inhalte von GLOBALS stehen anschliessend ebenfalls global zur Verfügung.

Ciao
Quaese
 
Dann hab ich jetzt noch eine rein technische Frage.

Wenn es dann Globale sind wieso nutzt man dann überhaupt das Konstrukt?
Code:
(function(){
  GLOBALS = {What:'inLeft'};
  fu="bla";
})();
GLOBALS = "test";
alert(GLOBALS);

würde ja das selbe ergeben also wieso dann dieser ganze Kopf davor?
Hab jetzt in jQuery auch mal noch nachgeschaut und finde dort ein Konstrukt mit Argumenten.
Mir fehlt nur irgendwie die Sinhaftigkeit bei sowas.
Hab hier mal nen Beispiel geschrieben ob sowas sin macht ist naja was anderes.

Code:
json= {"Bla":"ein wert..."};
(function(json){
  GLOBALS = {"A":json.Bla};
})(json);


alert(GLOBALS.A);
alert(json.Bla);

Vg
Stephan
 
Hi,

die Sinnhaftigkeit bei globalen Variablen liegt sicherlich darin, dass sie erst in der Funktion bestimmt bzw. berechnet werden können und anschliessend im übergeordneten Gültigkeitsbereich zur Verfügung stehen. Werden hierfür z.B. Hilfsvariablen benötigt, können diese lokal deklariert werden und man muss sich somit weniger Gedanken um Gleichbenennungen machen. Der globale Gültigkeitsbereich bleibt "einfach sauberer".

Im Falle von jQuery sprichst du sicherlich von Konstrukten der Form:
Code:
(function($){
  // Anweisungen
})(jquery);

Damit wird lediglich das jquery-Objekt gekapselt. Innerhalb der anonymen Funktion steht das Objekt nun in der Variablen $ zur Verfügung.

Dieses Vorgehen wird in der PlugIn-Entwicklung gewählt, um Komplikationen mit anderen Frameworks entgegen zu wirken. Denn innerhalb kann nun wie gewohnt auf die "$-Notation" zurückgegriffen werden und es wird immer das richtige Objekt (jquery) angesprochen.

Ciao
Quaese
 

Neue Beiträge

Zurück