"this" in einer anonymen Funktion?

8

In John Resigs Buch "Pro Javascript techniques" beschreibt er eine Möglichkeit, dynamische Objektmethoden mit folgendem Code zu erzeugen:

%Vor%

Das Problem ist, wenn ich versuche, das obige Objekt zu instanziieren, werden die dynamischen Methoden an das Fensterobjekt anstelle des instanziierten Objekts angefügt. Es scheint, als ob "dies" sich auf das Fenster bezieht.

%Vor%

Wenn Sie den obigen Code ausführen, wird der Fehler "user.getname ist keine Funktion" ausgegeben.

Wie werden die dynamischen Funktionen für jedes instanziierte Objekt korrekt generiert?

    
levi 04.03.2012, 02:55
quelle

4 Antworten

11

Ist dieser Code aus dem Buch? Ich habe das Buch, aber ich habe es nicht gelesen.

Es ist ein Fehler im Buch. Überprüfen Sie die Errata: Ссылка

In der anonymen Funktion ist this das globale window .

Sie könnten es schaffen, indem Sie .call(this, i) nach dem hinzufügen.

%Vor%     
Rocket Hazmat 04.03.2012, 03:04
quelle
3

Das this in der inneren selbstausführenden Funktion ist nicht dasselbe wie das in der äußeren User -Funktion. Wie Sie bemerkt haben, bezieht es sich auf das globale window .

Das Problem ist behoben, wenn Sie den Code geringfügig ändern, indem Sie eine Variable hinzufügen, die auf das äußere this verweist.

%Vor%

Das heißt, ich bin mir nicht sicher, warum die anonyme selbstausführende Funktion hier überhaupt benötigt wird, also haben Sie die einfachere Option, sie einfach ganz auszulassen, so:

%Vor%     
Peter Olson 04.03.2012 03:04
quelle
1

Hier ist, wie es geht. Sie müssen den Kontext in einer anderen Variablen speichern. Die andere Option besteht nicht darin, diese innere Funktion auszuführen, die Sie in der for-Schleife ausführen.

%Vor%

Option 2:

%Vor%     
Nikola Borisov 04.03.2012 03:05
quelle
1

Sie können immer einen anderen this für jeden Funktionsaufruf erzwingen, indem Sie die Methode apply verwenden.

%Vor%     
Endel 04.03.2012 03:10
quelle