Warum ist eine anonyme Funktion erforderlich, um "this" mithilfe von setTimeout zu erhalten

8

Ich habe setTimeout vielmals verwendet und eine Funktion als Referenz übergeben, z. B.

%Vor%

In einigen Fällen, um den Wert von this zu erhalten, musste ich es vorher einer Variablen zuweisen, verstehe aber nicht, warum das Folgende nicht funktioniert:

%Vor%

Die Verwendung einer anonymen Funktion funktioniert jedoch:

%Vor%     
Ben Foster 29.01.2014, 11:08
quelle

2 Antworten

5

Dies funktioniert nicht, da setTimeout eine Funktion mit dem Wert this als globales Objekt und nicht als übergeordnetes Objekt aufruft. Sie übergeben einen Wert an die Funktion setTimeout - sie wissen nicht, wie auf sie zugegriffen wurde, und können sie daher nicht mit dem richtigen this -Wert aufrufen (im Gegensatz zu normalen Variablen wird der Wert von this nur bestimmt wenn Sie die Funktion aufrufen, außer this wurde mit Function.prototype.bind ) an einen bestimmten Wert gebunden.

Wenn Sie dies in eine anonyme Funktion ändern, verwenden Sie den Abschluss, um auf den Wert von that zuzugreifen, auch wenn dieser Wert aufgerufen wird (der Variablenbereich einer Funktion wird festgelegt, wenn sie definiert ist, nicht wenn sie definiert ist) run).

Es ist einfach so, als ob du so etwas machst:

%Vor%

Es gibt auch eine verwandte Frage zur Verwendung von this mit setTimeout : Übergeben Sie den richtigen "this" -Kontext an setTimeout callback?

    
Qantas 94 Heavy 29.01.2014, 11:12
quelle
2

Weil Sie im ersten Fall nur die Funktion log referenzieren, die innerhalb des that -Objekts liegt, aber ihre Beziehung zu that ist verloren. Stellen Sie sich vor, dass setTimeout die Methode log direkt bei der gespeicherten Speicheradresse mit dem globalen Kontext aufruft.

Im zweiten Beispiel kommen Sie jedoch aus einem globalen Kontext, aber zuerst wird that gesucht und danach log , was dann mit dem Kontext von that aufgerufen wird.

Denken Sie an setTimeout mit der folgenden Struktur:

%Vor%     
Matyas 29.01.2014 11:12
quelle

Tags und Links