Matthias Scharwies: JavaScript: anonyme Funktion

Servus!

Mir ist grad aufgefallen, dass es im Wiki nichts zu anonymen Funktionen gibt.

Habe die zwei Artikel gelesen:

Würdet ihr auch vor einem exzessiven Einsatz warnen? Welche Nutzen gibt es? Empfehlen IIFE zu nehmen?

Wo sollte denn so etwas stehen?

[Glossar: anonyme Funktion](http://wiki.selfhtml.org/wiki/Glossar:anonyme Funktion)

[JavaScript/Funktion/anonyme Funktion](http://wiki.selfhtml.org/wiki/JavaScript/Funktion/anonyme Funktion)

[JavaScript/Funktion#anonyme Funktion](http://wiki.selfhtml.org/wiki/JavaScript/Funktion#anonyme Funktion)

Bin für jede Rückmeldung dankbar!

Herzliche Grüße

Matthias Scharwies

--
Es gibt viel zu tun: ToDo-Liste
  1. Hallo und gute Nacht,

    Bin für jede Rückmeldung dankbar!

    Für PHP hatte ich ja mal eine exemplarisch in den Counter-Artikel eingebaut.

    Im Prinzip sind anonyme Funktionen doch nur Reparatur-Gebastel, weil es in den Konzepten keine private functions / local functions, so wie z. B. in Turbo-Pascal oder xBase, ... gibt.

    Dazu gehört dann vielleicht auch "Array of Functions", das in PHP zumindest, die Vorstufe zu OOP darstellen kann.

    Interessant sind sie daher immer, wenn man Polymorphie nutzen will, ohne gleich zu OOP zu wechseln.

    Grüße
    TS

    --
    es wachse der Freifunk
    http://freifunk-oberharz.de
  2. Tach!

    Der hat einige fragwürdige Begriffsverwendungen drin. "Anonyme Funktionen sind Funktionen ohne Namen, die sofort ausgeführt werden." - Nö, die müssen nicht sofort ausgeführt werden. IIFE-Konstrukte werden sofort ausgeführt, aber auf alle anderen anonymen Funktionen trifft das nicht zu.

    "Selbst-aufrufende Funktion". Das ist eine IIFE, die er da beschreibt. Die wird ebenfalls aufgerufen. Die ruft sich nicht selbst auf, das wäre bei Rekursion der Fall.

    Der Artikel stellt außerdem anonyme Funktionen als Möglichkeit zur Kapselung dar. Das kann eine benannte Funktion genausogut.

    Der hat einige Aspekte aufgezählt, die gegen einen Einsatz anonymer Funktionen sprechen. Seine Argumente sind im Wesentlichen nachvollziehbar. Manch ein Funktionsinhalt ist aber so simpel, dass man die negativen Effekte vernachlässigen kann.

    Achja, der andere Artikel zählt auch ein paar Argumente am Ende auf. Worin ich beiden nicht zustimme, ist die nicht vorhandene Wiederverwendbarkeit. Wenn ich die Funktion einer Variablen zuweise, ist sie sehr wohl wiederverwendbar. Andererseits ist Wiederverwendbarkeit auch keine in jedem Fall notwendige Eigenschaft. - Mit Strukturierung kann man ein komplexes System nicht weniger komplex machen, man kann es aber in kleine, besser verständliche Teile aufteilen. Zu viel Aufteilung kann aber auch wieder ins Gegenteil umschlagen, denn ein Projekt, das sich in zu viel Klein-Klein verzettelt hat, macht es nicht unbedingt einfacher, all das im Auge zu behalten.

    Würdet ihr auch vor einem exzessiven Einsatz warnen?

    Vor jedem unbedachten Einsatz sollte gewarnt werden. Das trifft aber auf alles zu, nicht nur auf anonyme Funktionen.

    Welche Nutzen gibt es? Empfehlen IIFE zu nehmen?

    Die IFFE hat ihren speziellen Einsatzzweck. Ein Ersatz für jegliche andere Art anonymer Nutzung ist sie auf keinen Fall.

    Wo sollte denn so etwas stehen?

    [JavaScript/Funktion#anonyme Funktion](http://wiki.selfhtml.org/wiki/JavaScript/Funktion#anonyme Funktion)

    Da steht sie schon. Ein Funktionsausdruck ist bereits eine anonyme Funktion. Es klingt erstmal paradox, denn wenn man sich var foo = function() {}; so ansieht, und dazu vielleicht noch einen Aufruf à la var qux = foo();, der sich in nichts von einem Aufruf einer benannten Funktion unterscheidet, müsste man meinen, dass foo ihr Name ist. Ist er aber nicht. Das ist nur eine Variable, die auf die anonyme Funktion verweist. var bar = foo; Die Funktion hat nun zwei Namen? Mitnichten, sie hat immer noch keinen, auch wenn jetzt bereits zwei Variablen draufzeigen.

    dedlfix.

    1. Guten Morgen!

      @TS und @dedlfix Vielen Dank für eure Rückmeldungen!

      Wo sollte denn so etwas stehen?

      [JavaScript/Funktion#anonyme Funktion](http://wiki.selfhtml.org/wiki/JavaScript/Funktion#anonyme Funktion)

      Da steht sie schon.

      Mein Problem, ist les' nicht sorgfältig genug.

      Ein Funktionsausdruck ist bereits eine anonyme Funktion. Es klingt erstmal paradox, denn wenn man sich var foo = function() {}; so ansieht, und dazu vielleicht noch einen Aufruf à la var qux = foo();, der sich in nichts von einem Aufruf einer benannten Funktion unterscheidet, müsste man meinen, dass foo ihr Name ist. Ist er aber nicht. Das ist nur eine Variable, die auf die anonyme Funktion verweist. var bar = foo; Die Funktion hat nun zwei Namen? Mitnichten, sie hat immer noch keinen, auch wenn jetzt bereits zwei Variablen draufzeigen.

      Vielen Dank!

      Ich habe die vorhandenen Informationen umgestellt. Passt die Einteilung so?

      Kann das erste Kapitel objektunabhängige Funktionen weg oder soll ich es unter JavaScript/window einstellen?

      Der hat einige Aspekte aufgezählt, die gegen einen Einsatz anonymer Funktionen sprechen. Seine Argumente sind im Wesentlichen nachvollziehbar. Manch ein Funktionsinhalt ist aber so simpel, dass man die negativen Effekte vernachlässigen kann.

      Dann werd ich das vorsichtig einpflegen.

      Achja, der andere Artikel zählt auch ein paar Argumente am Ende auf. Worin ich beiden nicht zustimme, ist die nicht vorhandene Wiederverwendbarkeit. Wenn ich die Funktion einer Variablen zuweise, ist sie sehr wohl wiederverwendbar. Andererseits ist Wiederverwendbarkeit auch keine in jedem Fall notwendige Eigenschaft.

      sehr gut erklärt - danke!

      Herzliche Grüße

      Matthias Scharwies

      --
      Es gibt viel zu tun: ToDo-Liste
      1. Tach!

        Ich habe die vorhandenen Informationen umgestellt. Passt die Einteilung so?

        Ich denke, ja.

        Kann das erste Kapitel objektunabhängige Funktionen weg oder soll ich es unter JavaScript/window einstellen?

        Lass es da. Das kann ruhig darüber aufklären, dass es eine Sonderstellung gibt.

        Der hat einige Aspekte aufgezählt, die gegen einen Einsatz anonymer Funktionen sprechen. Seine Argumente sind im Wesentlichen nachvollziehbar. Manch ein Funktionsinhalt ist aber so simpel, dass man die negativen Effekte vernachlässigen kann.

        Dann werd ich das vorsichtig einpflegen.

        Übrigens, alle Eigenschaften sind per se zuerst einmal neutral. Ob sie negativ oder positiv sind, hängt immer von der Betrachtungsweise und vom Anwendungsfall ab. Einige Eigenschaften scheinen grundsätzlich negativ behaftet zu sein. Das ist aber nicht der Fall. Auch da ergibt sich das aus dem Kontext, und nur deswegen, weil dann das der hauptsächlich verwendete Kontext ist. Diese Kontextabhängigkeit sollte man immer bedenken, wenn man Positiv- oder Negativlisten erstellt.

        dedlfix.

        1. Hab mutig nochmal an dem Artikel rumgemacht; mit der Deklaration bin ich jetzt zufriedener. Am "Aufruf" Teil war ich noch nicht dran, ich muss aber jetzt weg.

          Wenn's nicht gefällt, ok, dann motzt nur ;-)

          Die Idee, anonyme Funktionen zu vermeiden, werde ich auch noch reinhängen, das ist einfach eine gute Idee im Sinne von lesbarerem Code.

          Rolf

          1. Servus!

            Hab mutig nochmal an dem Artikel rumgemacht; mit der Deklaration bin ich jetzt zufriedener. Am "Aufruf" Teil war ich noch nicht dran, ich muss aber jetzt weg.

            vielen Dank, habe einige Links / Querverweise eingefügt.

            Wenn's nicht gefällt, ok, dann motzt nur ;-)

            Auf keinen Fall!

            Die Idee, anonyme Funktionen zu vermeiden, werde ich auch noch reinhängen, das ist einfach eine gute Idee im Sinne von lesbarerem Code.

            Ok.

            Ich mach mich mal an moderne Beispiele ohne

            <button type="button" onclick="PrimzahlCheck(document.PrimzahlFormular.Eingabezahl.value)">
              auf Primzahl checken
            </button>
            

            oder

             <button type="button" onclick="SchreibeBrutto(document.BruttoForm.NettoEingabe.value,document.BruttoForm.ProzentEingabe.value)">
            Brutto ermitteln
            </button>
            

            Wie konnte uns sowas durchrutschen?

            Rolf

            Herzliche Grüße

            Matthias Scharwies

            --
            Es gibt viel zu tun: ToDo-Liste
            1. Hallo Matthias Scharwies,

              Ich mach mich mal an moderne Beispiele ohne

              <button type="button" onclick="PrimzahlCheck(document.PrimzahlFormular.Eingabezahl.value)">
                auf Primzahl checken
              </button>
              

              oder

               <button type="button" onclick="SchreibeBrutto(document.BruttoForm.NettoEingabe.value,document.BruttoForm.ProzentEingabe.value)">
              Brutto ermitteln
              </button>
              

              Wie konnte uns sowas durchrutschen?

              Weil dies über einen langen Zeitraum hinweg die schnellste und sicherste Methode war, browserübergreifend Javascripte zum laufen zu bringen. Das Registrieren von Eventhandlern im JS selbst erforderte eine Fallunterscheidung.

              Bis demnächst
              Matthias

              --
              Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
              1. Servus!

                Wie konnte uns sowas durchrutschen?

                Weil dies über einen langen Zeitraum hinweg die schnellste und sicherste Methode war, browserübergreifend Javascripte zum laufen zu bringen.

                Ja, und es war bei der Wikifizierung ja immer die Frage zwischen völliger Neufassung, Überarbeitung und reiner Textübertragung, die ich aus Mangel an Zeit und Mitstreitern oft zugunsten des Letztern entschied.

                Glücklicherweise gibt's mittlerweile immer weniger dieser dunklen Ecken.

                Herzliche Grüße

                Matthias Scharwies

                --
                Es gibt viel zu tun: ToDo-Liste
  3. Servus!

    Würdet ihr auch vor einem exzessiven Einsatz warnen? Welche Nutzen gibt es?

    Ein großer Nutzen ergibt sich daraus, dass anonyme Funktionen als Code-Referenz konfliktfrei über mehrere Namespaces hinweg verwendet werden können. Beispielsweise um Klasseninstanzen zur Laufzeit erweitern zu können mit Methoden deren Namen zum Zeitpunkt der Instanzerstellung noch gar nicht feststehen.

    .

    1. Tach!

      Ein großer Nutzen ergibt sich daraus, dass anonyme Funktionen als Code-Referenz konfliktfrei über mehrere Namespaces hinweg verwendet werden können.

      Das ist mit benannten Funktionen problemlos ebenso erreichbar. Ob man eine Variable mit Referenz auf eine (anonyme) Funktion oder eine Referenz auf eine benannte Funktion übergibt, bleibt sich gleich.

      Beispielsweise um Klasseninstanzen zur Laufzeit erweitern zu können mit Methoden deren Namen zum Zeitpunkt der Instanzerstellung noch gar nicht feststehen.

      Klasseninstanzen bei Javascript?

      Natürlich kann man Objekte zur Laufzeit um Eigenschaften erweitern, auch solche die auf anonyme oder benannte Funktionen verweisen, um dann damit sozusagen Methoden hinzuzufügen. Ob das aber der Weisheit letzter Schluss ist, wage ich zu bezweifeln. Das kann man machen, das gibt die Sprache her. Aber ohne einen Anwendungsfall zu kenne, klingt das erstmal ziemlich abenteuerlich. Das ergibt jedenfalls Code, der erst zur Laufzeit offenbart, was wirklich abläuft. Das macht solche Konstrukte sicher nicht einfacher verständlich.

      Übrigens kann man auch die Prototypen um Eigenschaften erweitern. Das macht man aber eher definiert und bevor der eigentliche Kern der Anwendung startet, weil feststeht, dass man die Funktionalität benötigt. Beispiel sei hier die Erweitung von Standard-Objekten um den Nachbau von Funktionen von zukünftigen Javascript-Versionen. Auch das geht mit benannten Funktionen genauso wie mit anonymen, ist also kein Vorteil.

      dedlfix.

      1. Tach!

        Ein großer Nutzen ergibt sich daraus, dass anonyme Funktionen als Code-Referenz konfliktfrei über mehrere Namespaces hinweg verwendet werden können.

        Das ist mit benannten Funktionen problemlos ebenso erreichbar.

        Ne, eben nicht. Sonst hätte ich das hier ja nicht gepostet, ich hatte mich aber nicht auf JS festgelegt.

        MfG

      2. Klasseninstanzen bei Javascript?

        Entschuldigung, ich hab nicht gesehen dass es hier nur um JavaScript geht.

        Natürlich kann man Objekte zur Laufzeit um Eigenschaften erweitern, auch solche die auf anonyme oder benannte Funktionen verweisen, um dann damit sozusagen Methoden hinzuzufügen. Ob das aber der Weisheit letzter Schluss ist, wage ich zu bezweifeln. Das kann man machen, das gibt die Sprache her. Aber ohne einen Anwendungsfall zu kenne, klingt das erstmal ziemlich abenteuerlich. Das ergibt jedenfalls Code, der erst zur Laufzeit offenbart, was wirklich abläuft. Das macht solche Konstrukte sicher nicht einfacher verständlich.

        Das kommt darauf an, wie man damit umgeht. Wenn z.B. konfiguriert wird

        interface = date

        ist das schon mal verständlich. Der Vorteil wird hier sichtbar:

        [foo]
        interface = date
        class = Foo
        
        [bar]
        interface = date
        class = Bar
        

        oder anders ausgedrückt werden Coderedundanzen vermieden. Praktisch kann das interface zu beliebigen Klassen hinzukonfiguriert werden und programiertechnisch werden Funktionen später als zum Zeitpunkt der Instanzerstellung in den Namensraum der jeweiligen Klasse eingebracht. Konfliktfrei ist sowas nur mit Codereferenzen möglich.

        Insgesamt alles Andere als abenteuerlich sondern richtig gute Praxis.

        .

  4. Hallo Matthias,

    Würdet ihr auch vor einem exzessiven Einsatz warnen? Welche Nutzen gibt es? Empfehlen IIFE zu nehmen?

    das erinnert mich irgendwie an die pauschalen Warnungen vor dem Einsatz von Tabellen, Frames, eval (is evil) und so weiter.

    Ob man mit den Techniken Probleme optimal löst, oder ob man damit Unfug anrichtet, hängt von den Problemen ab. Auf pauschale Warnungen würde ich grundsätzlich verzichten.

    Ich selbst habe bei meinen Aufgaben mit Frames schlechte, mit IIFEs, Tabellen und eval aber gute Erfahrungen gemacht.

    Gruß
    Jürgen