• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

javascript function - konstruktion mit this als parameter?

moloko

New member
Hallo zusammen,

ich versuche herauszufinden, welcher art die folgende konstruktion einer funktion ist
im folgenden ein beispiel:

HTML:
this.functionName.on('event', (function(_this) {
          return function( param ) {
            return setTimeout(function() {
              return #....
            }, 1000); // 1000 bezieht sich hier auf die zeit der setTimeout funktion wenn ich das richtig verstehe?
          };
})(this));

insbesonder frage ich mich für was der parameter (?) (this) steht, und worauf der sich bezieht?
danke für die hilfe, oder weitere beispiele, die mir helfen dies zu verstehen.
ist dies eine art rekurssion?

g.m.
 
Oh mein Gott, was für eine Konstruktion

Also "this" bezieht sich auf den aktuellen Scope. Das ist eins der schwierigeren Themen im Javascript-Umfeld. Im allgemeinen kann man sagen, dass "this" im globalen Scope das window-Objekt ist, befindet man sich aber z.B. innerhalb eines Objekt-Konstruktors, dann bezieht sich "this" auf die aktuelle Objektinstanz. Innerhalb von Eventhandlern bezieht sich "this" auf das auslösende Element.

Aaaaber: Mittels Function.prototype.apply kann man einen Scope-Wechsel erzwingen, indem man dem Funktionsaufruf den Scope als Parameter mitliefert. Innerhalb der Funktion wird sich "this" dann auf eben diesen Scope beziehen.

Hier gibt es weitere Stolpersteine.

Dieser Konstrukt
Code:
(function(_this) {
...
})(this)
ist eine sogenannte "unmittelbar ausgeführte anonyme Funktion", die hier "this" als Parameter bekommt und dieses an den internen (lokalen) Parameter "_this" weiterreicht.

Diese Funktion liefert eine Funktionsreferenz zurück : function(param) {...}, ist also eine sogenannte Funktions-Fabrik (function factory). Das ist hier erforderlich, da .on() als zweiten Parameter eine Funktionsreferenz erwartet.

Diese innere Funktion wiederrum liefert ein Timeout-Handle zurück, das von setTimeout() geliefert wird. Und ja: Die 1000 bezieht sich auf setTimeout, sprich nach 1000ms wird setTimeout aufgerufen, sobald die function(param) {...} von .on() aus getriggert wurde.

Starker Tobak, wo hasten das her?
 
Kleine Ergänzung: im globalen Scope ist this undefiniert und erzeugt einen Fehler, wenn man im strict-Modus programmiert. Und genau das ist einer der Gründe, warum ich empfehle, den strict-Modus zu verwenden.

PS: in einem window.setTimeout() mit return einen Wert zurückzugeben ergibt keinen Sinn, da der Wert niemals irgendwo ankommt. Ob es sinnvoll ist, in dem Eventlistener (was der .on() ja anscheinend registriert) die ID des Timeouts zurückzugeben, wage ich zu bezweifeln, aber wir wissen nicht, welches Framework du verwendest und was da noch alles dazwischengeschaltet ist.
 
Ich persönlich habe mir mittlerweile angewöhnt, den Strict-Mode in sämtlichen Funktionen zu verwenden. Macht das Ganze sauberer...
 
@mikdoe: ja.

@Julian: ich auch... wo's geht. Hab' ein paar Dinge in meinem Framework, die im strict-Mode nicht funktionieren.
 
Zurück
Oben