MB: IIEF JQuarry

Guten Tag,

ich stolpere immer wieder über diese IIFE oder "self-executing anonymous function” im internet maßgelich in JQuarry.

(function( window, undefined ) {
   // ...
})( window );
  • Welche funktion hat dieses Konstrukt?
  • Kann man parallelen dieses Konstruktes mit anderen OOP ziehen? Wenn ja wie sähe diese aus in anderen OOP Sprachen

Ich muss leider zugeben das ich IIEF nicht wirklich verstehe. Ich habe im Internet gesucht und zahlreiche Artikl gefunden aber für mich sagt jeder Artikel was anderes als der andere. Kurze Einleitung?

vlg MB

  1. Tach!

    Ich muss leider zugeben das ich IIEF nicht wirklich verstehe. Ich habe im Internet gesucht und zahlreiche Artikl gefunden aber für mich sagt jeder Artikel was anderes als der andere. Kurze Einleitung?

    Hast du die Seite zur IIFE in unserem Wiki auch gelesen? Da sind deine Fragen meines Erachtens beantwortet. Wenn noch welche übrigbleiben, dann ...

    dedlfix.

    1. Hast du die Seite zur IIFE in unserem Wiki auch gelesen? Da sind deine Fragen meines Erachtens beantwortet. Wenn noch welche übrigbleiben, dann ...

      nein habe ich nicht. Danke für den Verweis. Bin jetzt ein bissche schlauer aber für mich beantwortet das nicht die oben genannte JQuarry Funktion.

      Ich hab verstanden das das so abläuft:

      (function( parameter, ... ) { // Entgegennahme
          // ...
      })( parameter, ... ); // Übrgabeparameter
      

      kurz: wenn der Zeiger der auf diese Zeil trifft, führt er automatisch diese Funktion aus mit Übergabeparametern die definiert sind. Ich hoffe ich hab kurz und richtig zusammengefasst. Ich verstehe aber nicht was es mit diesem window-Objekt als parameter aufsich hat und was man damit machen kann

      vgl MB

      1. Tach!

        Ich verstehe aber nicht was es mit diesem window-Objekt als parameter aufsich hat und was man damit machen kann

        Was window ist, ist dir aber soweit klar? Es ist jedenfalls guter Stil, wenn man in einem abgegrenzen Raum ist, nicht auf Dinge zugreift, die sich außerhalb befinden. Tut man dies, hat man Abhängigkeiten, die man erst erkennt, wenn man den Code komplett gelesen hat. Es ist besser, sich diese Abhängigkeiten hereinreichen zu lassen. Dann weiß nicht nur der Aufrufer, was benötigt wird, er kann und muss sich auch darum kümmern, dass diese Abhängigkeiten zur Verfügung stehen. Und er kann dabei völlig frei entscheiden, wie er sie erfüllt.

        In dem Fall braucht also die IIFE das window-Objekt. Man kann bei window im Prinzip davon ausgehen, dass das immer zur Verfügung steht. Man kann aber als Autor einer Bibliothek, die nicht nur im eigenen Haus eingesetzt werden soll, nicht davon ausgehen, dass der Anwender in jedem Fall das globale window-Objekt verwendet sehen möchte. Deshalb schafft man hier die Möglichkeit, dass ein beliebiges anderes Objekt übergeben werden kann.

        dedlfix.

        1. Ok, für mich n bisschen viel Info, Ich hab dich so verstanden:

          Es ist jedenfalls guter Stil, wenn man in einem abgegrenzen Raum ist, nicht auf Dinge zugreift, die sich außerhalb befinden.

          du sprichst auf namespace an?

          Es ist besser, sich diese Abhängigkeiten hereinreichen zu lassen.

          Du meinst global scope unterbinden mit

          (function foo() { var bar = irgendwas; })();
          

          Dann weiß nicht nur der Aufrufer, was benötigt wird,

          also der parameter bar ?

          er kann und muss sich auch darum kümmern, dass diese Abhängigkeiten zur Verfügung stehen.

          welche abhänigkeit meinst du? wenn du das HTML noc nicht geladen hast, kannst du doch nicht auf elemente zugreifen de "noch" nicht existieren? Werde bitte genauer, wenns geht mit Code beispielen dann kann ich besser nachvollzehen was du meinst. ich hab mich inzwischen an die Metasyntaktische Variablen foo, bar, baz gewöhnt.

          Man kann bei window im Prinzip davon ausgehen, dass das immer zur Verfügung steht.

          Das habe ich unteranderem von euch gelernt ;-).

          lg MB

          1. Tach!

            Es ist jedenfalls guter Stil, wenn man in einem abgegrenzen Raum ist, nicht auf Dinge zugreift, die sich außerhalb befinden.

            du sprichst auf namespace an?

            Nein, ich spreche darauf an, dass ich nicht auf sowas wie window.setTimeout() direkt zugreife, sondern den Verwender meiner Bibliothek entscheiden lasse, was er mit reinreicht, und von dem Hereingereichten ruf ich das setTimeout() auf. In den meisten Fällen wird er mir window reinreichen. Aber wenn er doch was anderes übergeben möchte, kann er das nicht, wenn ich direkt das window im globalen Scope voraussetze und dieses ohne zu fragen nutze.

            welche abhänigkeit meinst du? wenn du das HTML noc nicht geladen hast,

            Nein, nicht die Webseite selbst, sondern Dinge, die mein Code voraussetzt, wie zum Beispiel Funktionen und anderes, das an window hängt.

            Man kann bei window im Prinzip davon ausgehen, dass das immer zur Verfügung steht.

            Das habe ich unteranderem von euch gelernt ;-).

            Den Satz muss ich einschränken auf: wenn die Anwendung im Browser läuft. Dass es serverseitig nicht window sondern global ist, wusste ich bis eben auch nicht.

            dedlfix.

            1. Hallo,

              außer der Austauschbarkeit von window und global erlaubt diese Parametrierung auch die Übergabe eines Mock-Objektes für window und damit die Unit-Testbarkeit der Bibliothek.

              Rolf

              1. Tach!

                außer der Austauschbarkeit von window und global erlaubt diese Parametrierung auch die Übergabe eines Mock-Objektes für window und damit die Unit-Testbarkeit der Bibliothek.

                Ja, man nimmt statt dieser Abhängigkeit eine "Fälschung", mit der man genau das Verhalten emuliert, das man von dieser Abhängigkeit erwartet. Also dass zum Beispiel ein Funktionsaufruf dort ein bestimmtes Ergebnis liefert. Man will das nicht gegen das reale fremde Objekt testen, weil man dann diesem gegebenenfalls ebenfalls ein Ökosystem bieten muss, in dem es laufen kann. Das ist aber nicht das was man bei Unittests nebenher auch noch sicherstellen möchte, sondern da will man sich ganz auf den eigentlichen Test des eigenen Codes konzentrieren können.

                dedlfix.

      2. Ich verstehe aber nicht was es mit diesem window-Objekt als parameter aufsich hat und was man damit machen kann

        Es macht deutlich, dass das JavaScript für den Browser geschrieben ist. In node.js heißt das globale Objekt nicht window sondern global. Man kann also sofort sehen, dass das Programm eine Abhängigkeit an den Browser hat. Wenn man allerdings nicht auf den globalen Scope zugreift, sollte man ihn auch nicht in die Parameter-Liste mitaufnehmen. Der zweite Parameter undefined ist ein Artefakt aus längst vergangen JavaScript-Tagen, in irgendeiner Uralt-Version war es nämlich möglich undefined zu überschreiben.

        Man kann sich diesen Affengriff heute sparen, indem man ein Modulsystem[1] einsetzt.


        1. https://forum.selfhtml.org/self/2016/jul/15/private-klassen-eigenschaften/1671239#m1671239 erster Abschnitt. ↩︎

  2. Hallo,

    in JQuarry

    nur am Rande bemerkt: Du meinst JQuery, abgeleitet von Query (Anfrage). Dagegen bedeutet Quarry soviel wie Steinbruch, aber auch Beute bzw. Opfer.

    Ich sage das deshalb, weil die falsche Schreibweise sowohl im Titel, als auch im Posting-Text auftaucht. Daher habe ich Absicht vermutet, und nicht einen einfachen Tippfehler.

    Ciao,
     Martin

    --
    Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
    - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    1. @@Der Martin

      nur am Rande bemerkt: Du meinst JQuery

      Da die Frage nichts mit jQuery zu tun hat, vermute ich, MB meint JavaScript. ;-)

      LLAP 🖖

      --
      “The best way to help people learn: answer their coding question an hour later, they’ll have likely figured it out by then.” —Todd Motto
      Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
    2. Hallo Martin,

      nur am Rande bemerkt: Du meinst JQuery, abgeleitet von Query (Anfrage). Dagegen bedeutet Quarry soviel wie Steinbruch, aber auch Beute bzw. Opfer.

      "jquarry.js" so habe ich die Datei gelesen und ich hab mich auch gewundert. Ich dachte mir JQuarry und JQuery sind gleichen Begriffe für dieses Framework. Aber ich glaube es ist nur Unwissenheit. Dank für die Aufklärung.

      vlg MB

      1. @@MB

        Ich dachte mir JQuarry und JQuery sind gleichen Begriffe für dieses Framework. Aber ich glaube es ist nur Unwissenheit. Dank für die Aufklärung.

        Wo wir bei Begriffen und Aufklärung sind: Ich würde jQuery nicht Framework nennen, sondern Bibliothek.

        LLAP 🖖

        --
        “The best way to help people learn: answer their coding question an hour later, they’ll have likely figured it out by then.” —Todd Motto
        Selfcode: sh:) fo:} ch:? rl:) br:> n4:& va:| de:> zu:} fl:{ ss:| ls:# js:|
        1. Hallo Gunnar,

          Wo wir bei Begriffen und Aufklärung sind: Ich würde jQuery nicht Framework nennen, sondern Bibliothek.

          kläre mich auf. Was ist der unterschied? Ich dachte mir das Bibliothek viele Frameworks sind? Oder liege ich da gänzlich falsch?

          lg MB

          1. Eine Bibliothek stellt Dir eine Menge an Funktionen zur Verfügung und überlässt es Dir, wie Du sie nutzt und wie Du dein Programm strukturierst.

            Ein Framework ist eine Sonderform einer Bibliothek: es gibt Dir auch die Struktur vor, wie Du dein Programm bauen musst, damit die darin enthaltenen Funktionen sinnvoll funktionieren (z.B. dass Du bestimmte Prototypen für Objekte verwenden musst, oder dass Du überhaupt Objekte für bestimmte Aufgaben verwenden musst (Model, View, Controller, etc).

            jQuery ist eine Bibliothek.

            Knockout oder Angular sind Frameworks (wobei Knockout ca 1% des Volumens von Angular abdecken dürfte :) ).

            Rolf