2011-01-11 5 views

Antwort

24

Ja - arguments.callee ist die aktuelle Funktion.

HINWEIS: Dies ist in ECMAScript 5 veraltet und kann einen Leistungseinbruch für Tail-Call-Rekursion und dergleichen verursachen. Es funktioniert jedoch in den meisten gängigen Browsern. In Ihrem Fall wird f1 auch funktionieren.

+2

'arguments.callee' ist nicht das richtige Werkzeug für diese Situation. Es ist in ECMAScript 5 "strict mode" veraltet und verhindert bestimmte Optimierungen durch Minifier. –

+14

@ Box9 gibt es eine Alternative? –

+2

@DavidTang es kann veraltet sein, aber es ist die einzige verfügbare Option. Vielleicht sollten sie es ablehnen. –

8

Sie können es mit f1 zugreifen, da wird die Funktion auf die Variable f1vor zugewiesen wurden sie genannt wird:

var f1 = function() { 
    f1(); // Is valid 
}; 

f1(); // The function is called at a later stage 
+1

... das ist komisch, aber nützlich. Nicht ganz eine angemessene Antwort auf die (zweideutig bebilderte) Frage, obwohl George sich in eine * anonyme * Funktion zurückziehen wollte. –

+2

@Christian, es ist überhaupt nicht komisch. Funktionsdeklaration und Funktionsausführung sind zwei völlig verschiedene Dinge. Und ich glaube, das * ist * die korrektere Lösung für die Frage des OP - 'var f1 = function() {}' ist eine anonyme Funktion. 'function f1() {}' ist nicht. Bitte lesen Sie http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript, warum 'arguments.callee' vermieden werden sollte. –

+1

Ah, ich verstehe. Seltsam, weil das 'Function'-Objekt zum Zeitpunkt der Definition nicht vollständig konstruiert war, daher (in meinen Augen) nicht zugewiesen an 'f1'. Ich dachte, dass George in einer anonymen Funktion, sagen wir, in einem JQuery-Event-Handler oder so etwas recurse. –

35

Name it.

var f1 = function fOne() { 
    console.log(fOne); //fOne is reference to this function 
} 
console.log(fOne); //undefined - this is good, fOne does not pollute global context 
+4

Ich frage mich, wer das abgelehnt hat. Dies ist im Grunde, wie man auf die aktuelle Funktion in anonymer Funktion zugreift. Und der Name bleibt erhalten, auch wenn er dann einem anderen Objekt zugewiesen wird, so dass Rekursion noch möglich ist. – Markos

+3

Das sollte die richtige Antwort –

+2

@ Markos sein - ein Funktionsausdruck mit einem Namen ist nicht mehr "anonymous". ;-) – RobG

Verwandte Themen