Funktions-Selbstreferenz

7

In JavaScript sind Funktionen einfach Objekte, die aufgerufen werden können. Also, was ist der einfachste Weg für den Körper einer Funktion, das tatsächliche Funktionsobjekt zu referenzieren?

this kann verwendet werden, um auf das enthaltene Objekt zu verweisen, von dem eine Funktion (oder genauer gesagt eine Methode) aufgerufen wird. Aber ich glaube, this bezieht sich niemals auf das eigentliche Funktionsobjekt selbst.

Offensichtlich kann bind , call oder apply verwendet werden, um den Wert von this für die Funktion zu ändern. Oder bind könnte verwendet werden, um eine Version der Funktion zu erstellen, die immer einen Verweis auf sich selbst als ihren ersten Parameter erhält.

Aber gibt es einen einfacheren Weg? Ich vermute nicht, aber ich könnte falsch liegen.

    
Levi Lindsey 09.10.2014, 16:51
quelle

4 Antworten

12

Ich kann mir keinen Fall vorstellen, in dem ein benannter Funktionsausdruck keinen anonymen Funktionsausdruck ersetzen kann. Daher würde ich vorschlagen, die Funktion zu benennen, wenn Sie sie von sich aus aufrufen wollen (d. H., Wenn Sie Rekursion verwenden wollen):

%Vor%

Dies funktioniert auch, wenn es sich um eine Referenz handelt:

%Vor%

Sie können sogar einen rekursiven IIFE (sofort aufgerufenen Funktionsausdruck) verwenden, wenn Sie den Namensraum nicht verschmutzen wollen:

%Vor%

Außerdem tun Sie etwas wie folgt:

%Vor%

Funktioniert auch und verschmutzt nicht den Namensraum.

    
Vivin Paliath 09.10.2014, 16:56
quelle
4

Das ist eigentlich eine Frustration von mir, weil Sie in der Lage waren, arguments.callee zu verwenden, was Ihnen einen Hinweis auf die Funktion geben würde. Wie jemand anderes erwähnt, ist dies nicht mehr möglich.

Dafür gibt es ein Muster ... und das heißt, die Funktion selbst zu benennen und zuzuweisen. Es sieht so aus:

%Vor%

Auf diese Weise können Sie auf die benannte Funktion verweisen und Ihr Geschäft weiterverfolgen. Beachten Sie, dass Sie die .call -Syntax verwenden müssen, wenn Sie sie als Methode bezeichnen möchten (so dass this eine Bedeutung hat), aber abgesehen davon ist es ziemlich einfach.

Eine andere Möglichkeit besteht darin, einen wirklich funktionalen Ansatz zu machen, bei dem Sie das zu operierende Objekt an eine Funktion übergeben:

%Vor%

Man könnte argumentieren, dass dies besser und flexibler ist. Ich denke, es ist eine Frage des Geschmacks, wirklich.

    
JayKuri 09.10.2014 17:05
quelle
2

Ich würde Ihren Funktionen einen Namen geben und sie dann verwenden, um sie zu referenzieren. Wenn Sie eine deklarierte Funktion oder eine Funktionsvariable haben, hat sie bereits einen Namen.

%Vor%

Wenn Sie eine anonyme Funktion haben, können Sie ihr einen Namen geben. Dieser Name wird nur innerhalb der Funktion existieren.

%Vor%     
Rocket Hazmat 09.10.2014 16:58
quelle
1

arguments.callee innerhalb einer Funktion ist ein Verweis auf die Funktion selbst, aber es ist nicht gerade gute Form. Sie sollten die Funktion benennen, dann können Sie einfach den Namen innerhalb der Funktion

verwenden     
Brennan 09.10.2014 16:53
quelle

Tags und Links