2016-07-05 27 views
5

A causa della grande differenza nella differenza di contesto tra le funzioni di freccia normale e ES6 mi piacerebbe essere in grado di scoprire quale è stato ricevuto su un callback fn.scoprire se la funzione di callback è una freccia ES6

typeofreturnfunction per entrambi. C'è un modo per distinguere?

+3

Si prega di non fare questo, se si sta progettando un API, dovrebbe funzionare in modo coerente con entrambi. Pensiamo ad esempio al codice di refactoring degli utenti, ti aspetteresti realisticamente che la firma di una funzione cambiasse in base alla funzione passata? Non vorrei. Inoltre, tieni presente che qualsiasi metodo di rilevamento probabilmente fallirebbe con le funzioni di freccia transpiled, quindi il tuo codice cambierebbe il comportamento a seconda dell'ambiente in cui era in esecuzione. – loganfsmyth

+0

Perché vuoi essere in grado di distinguere la differenza? –

+0

Non c'è alcuna differenza per il ricevitore del callback. Puoi semplicemente chiamare tutti i tipi di callback. – Bergi

risposta

6

Le funzioni freccia non possono essere utilizzate come costruttori e mostrano typeof arrowFunc.prototype come undefined, mentre una funzione senza freccia mostra "oggetto".

+0

Confermato il funzionamento in Chromebook Chrome 51.0.2704.103 con 'x = function() {return 1;}; y = (() => 1); console.log (typeof x.prototype, typeof y.prototype); 'yielding' object, undefined' – Paul

+0

Restituisce 'object' per entrambi, in [this fiddle] (http://www.es6fiddle.net/iqa214ua/) . – daniloprates

+0

hmmm Immagino che non funzionerà su Babel, dal momento che sta eseguendo le normali funzioni:/ma grazie per la soluzione, sembra essere il modo migliore quando il compilatore non è un problema. – daniloprates

2

È possibile utilizzare Function.toString() per restituire una rappresentazione di stringa del codice sorgente della funzione, quindi cercare una freccia (=>) nella stringa.

var arrowFunc = x => 2 * x 
var regFunc = function (x) {return 2 * x} 

arrowFunc.toString().indexOf("=>") // 2 
regFunc.toString().indexOf("=>") // -1 
+0

questo non rileva una funzione di freccia non con una funzione di freccia annidata, o un valore di parametro predefinito di una funzione di freccia, come una freccia funzione? – traktor53

+0

Immagino che rileverà una funzione di freccia annidata, che potrebbe essere prevenuta valutando il ritorno di 'indexOf' in alcuni casi. Non sono sicuro del valore predefinito del parametro, non usano '=>' vero? –

+0

Solo se il valore predefinito è una funzione e definito in linea come una funzione freccia ... – traktor53

Problemi correlati