2015-07-15 18 views
5

Una delle funzionalità introdotte da ECMAScript 6 è la possibilità di indicare valori predefiniti per parametri non specificati in JavaScript, ad es.Creare dinamicamente una funzione con i parametri predefiniti in JavaScript

function foo(a = 2, b = 3) { 
    return a * b; 
} 

console.log(foo()); // 6 
console.log(foo(5)); // 15 

Ora mi chiedo se è possibile utilizzare i parametri di default anche per funzioni create in modo dinamico con il costruttore Function, in questo modo:

new Function('a = 2', 'b = 3', 'return a * b;'); 

Firefox 39 sembra già supportare parametri di default (see here) , ma la riga sopra è rifiutata come errore di sintassi.

+0

Hmmm, perché avete bisogno di un argomento stringa invece di 'un = 2'? Sarebbe leggermente più difficile da usare, non è vero? –

+1

Questo sembra essere relativo a [questo] (https://bugzilla.mozilla.org/show_bug.cgi?id=755821) bug. – DavidDomain

risposta

0

Come new Function è una forma di eval in ogni caso è possibile utilizzare il seguente codice per questo compito:

eval('function bar (a = 2, b = 3) { return a * b; }'); 
+0

Cura di spiegare il downvote @ anonimo? – Dodekeract

+0

Probabilmente perché è una dichiarazione di funzione, quindi 'eval' tornerà indefinito. Dovresti invece utilizzare un'espressione di funzione. – Oriol

0

Non so se questo dovrebbe funzionare - qualcun altro dovrà dire - ma se continua a essere un problema, perché non usare eval()?

qualcosa nelle linee su questo dovrebbe essere legale:

var fct1 = eval("(function foo(a = 2, b = 3) { return a * b; })") 
1

Ora mi chiedo se è possibile utilizzare i parametri di default anche per funzioni create in modo dinamico con il costruttore funzione

Sì, secondo lo the spec questo è possibile. Gli argomenti dei parametri sono concatenati come sempre e quindi analizzati in base alla produzione FormalParameters, che include i valori predefiniti.

Firefox 39 sembra già supportare i parametri predefiniti, ma la riga sopra è rifiutata come errore di sintassi.

Beh, questo è un bug :-) (probabilmente this one)
Si dovrebbe essere in grado di lavorare intorno ad esso utilizzando

var fn = Function('return function(a = 2, b = 3) { return a * b; }')(); 
Problemi correlati