2015-03-26 11 views
5

Ich benutze Pfeil-Funktionen in einer App und manchmal ist es notwendig, einen Verweis auf die Funktion selbst zu bekommen. Für normale JavaScript-Funktionen kann ich sie einfach benennen und den Namen von innen verwenden. Für Pfeilfunktionen verwende ich derzeit arguments.callee. Gibt es eine Möglichkeit, Pfeilfunktionen so zu benennen, dass eine Referenz von innen verwendet werden kann?Gibt es eine Möglichkeit, Pfeilfunktionen in Javascript zu benennen?

Beispielcode

//typescript 
private evaluateIf(expr: parserModule.IIfExpression, callback: IEnvCallback) { 
    this.evaluate(expr.condition, proceed=> { 
     guard(arguments.callee, arguments, this); 
     if (proceed !== false) this.evaluate(expr.then, callback); 
     else if (expr.else) this.evaluate(expr.else, callback); 
     else callback(false); 
    }); 
} 

//javascript 
    Environment.prototype.evaluateIf = function (expr, callback) { 
    var _this = this; 
    this.evaluate(expr.condition, function (proceed) { 
     guard(arguments.callee, arguments, _this); 
     if (proceed !== false) 
      _this.evaluate(expr.then, callback); 
     else if (expr.else) 
      _this.evaluate(expr.else, callback); 
     else 
      callback(false); 
    }); 
}; 

Was ich nach der Hilfe ließ sich auf, da Argumente es nicht für immer sein könnte

private evaluateIf(expr: parserModule.IIfExpression, callback: IEnvCallback) { 
    var fn; 
    this.evaluate(expr.condition, fn = proceed=> { 
     guard(fn, [proceed], this); 
     if (proceed !== false) this.evaluate(expr.then, callback); 
     else if (expr.else) this.evaluate(expr.else, callback); 
     else callback(false); 
    }); 
} 
+3

Ist das nicht der wichtigste Punkt der Pfeil Funktionen nur prägnante Weise anonyme Funktionen auszudrücken, mit dem richtigen 'this' Bindung? Daher hätten sie sowieso keine Namen mit dem JS-Äquivalent. – GregL

+3

Sieht so aus, als ob Sie keine Pfeilfunktionen, sondern einen benannten Funktionsausdruck möchten. –

+1

Nein. Eigentlich möchte ich die Pfeilfunktionen nutzen und sie funktionieren gut. Allerdings implementiere ich ein Stück Code (nach einem Tutorial), das erfordert, dass ich die aufrufende Funktion als Teil eines "Guarding" -Prozesses benutze. Ich möchte wissen, wie man arguments.callee vermeidet und gleichzeitig vermeidet, jede Funktion, die von einer normalen JavaScript-Funktion betroffen ist, zu ändern. – ritcoder

Antwort

9

Gibt es eine Möglichkeit zu nennen Pfeil funktioniert so, dass eine Referenz sein kann verwendet von innerhalb

Nicht, es sei denn Sie ordnen es einer Variablen zu. Zum Beispiel:

var foo =() => { 
    console.log(foo); 
} 

für Pfeil Funktionen, bin ich zur Zeit arguments.callee

arguments sind nicht durch den Pfeil Funktionen unterstützt. TS erlaubt derzeit nicht korrekt, sie zu verwenden. Dies wird in der nächsten Version von typescript ein Fehler sein. This is to keep typescript arrow functions compatible with the JS Language Specification.

Für Ihren Anwendungsfall würde ich nur einen function

+0

Oh ok. Also funktioniert mein Code jetzt, weil Typoskript sie momentan nicht nach es6 konvertiert. Da typescript es in plain javascript umwandelt, gibt es eine Möglichkeit, um der Funktion, die es generiert, einen Namen zu geben? Ich habe einige Beispielcode so wird die Frage bearbeiten und fügen Sie es hinzu, da es nicht gut formatiert ist – ritcoder

+0

Sorry, ich war unklar. Argumente werden unabhängig davon, auf welche Version (es6, es5, es3) Sie abzielen, ein Fehler sein. Ich habe meine Antwort aktualisiert – basarat

+0

@Ritcoder Ich habe auch ein Codebeispiel hinzugefügt, um zu erklären, was ich mit einer Variablen zuweisen wollte – basarat

Verwandte Themen