dedlfix: Unsinnige Scope-Erstellung?

Tach!

Mir lief grad eben ein solches Konstrukt über den Weg:

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

Anstelle der drei Punkte befand sich nicht weiter relevanter Code. Hat der Ersteller möglicherweise nur nicht gewusst, dass man das auch wie folgt schreiben kann, oder hat das irgendeine andere sinnvolle Bewandnis, den DOM-Ready-Funktionsaufruf nochmal extra in einen Scope zu packen?

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

Ich meine, jQuery() liegt im globalen Scope. Diese Funktion im globalen Scope aufzurufen, in dem sie ja sowiso schon liegt, bringt doch keine Nachteile gegenüber einem Aufruf in einem anderen Scope, in den sie hineingereicht wurde, und in dem ansonsten nichts weiter passiert.

Es folgen ein paar erläuternde Worte, die der Wissenbildung für Interessierte dienen sollen und nicht direkt Teil der Fragestellung sind. Das Konstrukt

(function() {  
    ...  
})();

ist eine so genannte IIFE, eine Immediately Invoked Function Expression, also ein sofort aufgerufener Funktionsausdruck. Der dient dazu, einen Scope zu schaffen. Man nimmt so etwas, um zu vermeiden, dass der globale Namensraum mit zu viel Krams gefüllt wird. Das führt sonst eventuell zu Konflikten mit Bezeichnern aus anderen eingebundenen Bibliotheken. Wenn jede(r) seinen eigenen Scope verwendet, werden solche Konflikte vermieden.

Bei jQuery ist es so, dass es den Bezeichner jQuery und das $ als alternativen Namen gibt, wobei man das so konfigurieren kann, dass das $ zur Konfliktvermeidung aus dem globalen Scope herausgehalten wird. Damit man das $ trotzdem nutzen kann und nicht immer das lange "jQuery" schreiben muss, kann man das $ als Parameter in der DOM-Ready-Funktion angeben. jQuery(function ($) { ... }); Anstelle der drei Punkte kann nun Code stehen, der das $ verwendet. Dort existiert durch die anonyme Funktion ein eigener Scope, in dem das $ eingeschlossen ist.

dedlfix.

  1. Meine Damen und Herren, habe ich Ihre Aufmerksamkeit?

    (function($) {

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

    
    >   
    > Anstelle der drei Punkte befand sich nicht weiter relevanter Code. Hat der Ersteller möglicherweise nur nicht gewusst, dass man das auch wie folgt schreiben kann, oder hat das irgendeine andere sinnvolle Bewandnis, den DOM-Ready-Funktionsaufruf nochmal extra in einen Scope zu packen?  
      
    Vielleicht hat er den äußeren Scope profilaktisch angelegt, weil irgendwann weitere Funktionalität hinzukommen könnte, die schon vor dem "load"-Ereignis stattfinden könnte.  
      
    Oder ein Coding-Styleguide oder [Linter](http://www.jslint.com/) schreibt den IIFE stumpf immer vor.  
    
    -- 
    “All right, then, I'll go to hell.” – Huck Finn
    
    1. Lieber 1UnitedPower,

      profilaktisch

      sehr schön! Passt zu dem, was ich auf Gunnars Tipp hin geschaut habe. Aber Du meintest sicherlich prophylaktisch.

      Liebe Grüße,

      Felix Riesterer.

      --
      "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
      1. Meine Damen und Herren, habe ich Ihre Aufmerksamkeit?

        profilaktisch

        sehr schön! Passt zu dem, was ich auf Gunnars Tipp hin geschaut habe. Aber Du meintest sicherlich prophylaktisch.

        Wo ist der "Danke und im Boden versinken"-Button?

        --
        “All right, then, I'll go to hell.” – Huck Finn
        1. Lieber 1UnitedPower,

          Wo ist der "Danke und im Boden versinken"-Button?

          den braucht es wahrlich nicht. Im Gegenteil! Ich hatte da nur wieder einmal diese übliche Belehrungsreaktion - eine berufliche Krankheit...

          Liebe Grüße,

          Felix Riesterer.

          --
          "Wäre die EU ein Staat, der die Aufnahme in die EU beantragen würde, müsste der Antrag zurückgewiesen werden - aus Mangel an demokratischer Substanz." (Martin Schulz, Präsident des EU-Parlamentes)
        2. Hi,

          profilaktisch
          Aber Du meintest sicherlich prophylaktisch.

          Oxyd wurde deformiert zu Oxid
          Delphin wurde deformiert zu Delfin

          ==> prophylaktisch wird deformiert zu profilaktisch.

          Wo ist der "Danke und im Boden versinken"-Button?

          Damit ihn die Rechtschreibdeformer benutzen können?

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
          1. Hallo,

            Oxyd wurde deformiert zu Oxid

            ich weiß ja nicht, wie lange deine Schulzeit (speziell Chemie) zurückliegt, aber für mich (Abi 1988) war Oxid schon immer Oxid, analog zu Sulfid, Chlorid und vielen anderen. Auch wenn es sich von Oxygenium ableitet. Das geht auf eine Namenskonvention der IUPAC zurück, nach der das Anion eines Elements immer mit -id bezeichnet wird.

            Oxid mit 'y'? Das erinnert mich an Leute, die die Vorsilbe für den millionsten Teil einer Einheit als "mükro" aussprechen, nur weil sie mit dem griechischen Buchstaben my bezeichnet wird.

            Delphin wurde deformiert zu Delfin

            Das empfinde ich auch als üble Deformation.

            Ciao,
             Martin

            --
            Lieber Blödeleien als blöde Laien.
            Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
            1. Om nah hoo pez nyeetz, Der Martin!

              Oxid mit 'y'?

              Gibts immer noch. Hat auf dem Atari immer wahnsinnig Spaß gemacht. Enigma ist ebenfalls ein Spiel, was süchtig machen kann.

              Matthias

              --
              Der Unterschied zwischen Java und JavaScript ist größer als der zwischen Ra und Raab.

          2. Hakuna matata!

            Wo ist der "Danke und im Boden versinken"-Button?

            Damit ihn die Rechtschreibdeformer benutzen können?

            Jetzt bin ich also schon ein Rechtschreibdeformer. Wenn es dich beruhigt, ich hatte keine ketzerischen Hintergedanken, ich habe es einfach nicht besser gewusst, habe mich kurz dafür geschämt und inzwischen ist der Scham auch schon wieder verflogen.

            Ich konnte mich auch mal über Rechtschreib-Reformen echauf­fie­ren, inzwischen habe ich das hinter mir gelassen. Sprache ist in einem ständigen Wandel, das ist keine Erscheinung dieses Jahrzehnts und erst recht kein Indiz für einsetzende Verdummung. Es ist einfach die Natur der Sprache, so alt wie die Sprache selbst. Was ist an "Delfin" denn schlechter als an "Delphin"? Sprache dient letztendlich nicht dem Selbstzweck, sondern dem Informationsaustausch.

            --
            “All right, then, I'll go to hell.” – Huck Finn
  2. (function($) {

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

    
    >   
    > Anstelle der drei Punkte befand sich nicht weiter relevanter Code. Hat der Ersteller möglicherweise nur nicht gewusst, dass man das auch wie folgt schreiben kann, oder hat das irgendeine andere sinnvolle Bewandnis, den DOM-Ready-Funktionsaufruf nochmal extra in einen Scope zu packen?  
      
    Zunächst: Falls mal Code hinzu kommt, den man vor Dom-Ready ausführen möchte, müsste man eh die IIFE eh drumherum bauen, um den globalen Scope nicht zu versauen. Eine weitere Möglichkeit wären Helferfunktionen, beliebige andere Konstrukte...  
      
    jQuery bietet zwar einen eigenen Mechanismus, um die aktuelle Version einzuschließen, dass muss aber nicht für alle Bibliotheken gelten, die man evtl. verwenden möchte. In dem Fall müsste man beide Schreibweisen mischen, obwohl Sie denselben Zweck verfolgen. Ich mag obige Schreibweise, da Sie äußere Abhängigkeiten klar als solche deklariert.  
    
    
    1. Tach!

      Zunächst: Falls mal Code hinzu kommt, den man vor Dom-Ready ausführen möchte, müsste man eh die IIFE eh drumherum bauen, um den globalen Scope nicht zu versauen. Eine weitere Möglichkeit wären Helferfunktionen, beliebige andere Konstrukte...

      Die können doch ihre eigenen IIFEs bekommen, und vielleicht auch in ihren eigenen Dateien wohnen. (Also nicht jede Funktion separat, aber irgendwie sinnvoll gruppiert. Zusammenfügen um Download-Requests zu sparen, steht auf einem anderen Blatt.)

      jQuery bietet zwar einen eigenen Mechanismus, um die aktuelle Version einzuschließen, dass muss aber nicht für alle Bibliotheken gelten, die man evtl. verwenden möchte. In dem Fall müsste man beide Schreibweisen mischen, obwohl Sie denselben Zweck verfolgen.

      Ja, wenn. Aber das ist hier eher ein YAGNI-Fall. (Den Kontext hab ich nicht erwähnt, so dass du das nicht wissen konntest.) Das eigene Zeug kommt sowieso nach anderswo. Man schreibt sich den eigenen Code ja nicht einfach so in fremde Dateien, das kann doch bei Updates keiner warten.

      dedlfix.

  3. Tach!

    Ich danke euch für die Antworten und fasse mal zusammen: Ja, derzeit nicht wirklich sinnvoll, aber es gibt Anwendungsfälle, wenn noch mehr Code hinzukommt, den man da reinpacken kann.

    dedlfix.