2015-05-18 9 views
5

C'è qualche motivo per cui questa riga di codice non dovrebbe funzionare?Strana interazione tra la nuova funzione e eval

new Function("eval('function foo(){ alert() }'); foo()")() 

Si apre un avviso in Chromium come previsto, ma non riesce in Firefox (foo non è definito). Si tratta di un bug di Firefox o c'è qualcosa di sbagliato nel mio codice?

+0

Questo suona come un modo di modalità rigoroso/non rigoroso: sei sicuro di averli eseguiti entrambi in modalità non rigida? (Comportamento di Chrome) o modalità rigorosa (Firefox)? (Aggiornamento: guardando le specifiche questa potrebbe essere una cosa es5 vs es2015 (es6)) –

+0

@BenjaminGruenbaum Ci ho pensato. Sono abbastanza sicuro di aver eseguito entrambi in modalità non forzata. Tuttavia, la modalità rigorosa non dovrebbe avere alcun effetto, in quanto la nuova funzione non dovrebbe rispecchiare tale aspetto (diversamente da una funzione normale). – user2345215

+0

Mentre è interessante che i browser si comportino in modo diverso, mi chiedo ancora "perché ci importa?" XD –

risposta

-1

Il problema è che eval non eredita l'ambito globale, pertanto foo viene creato in un ambito diverso da quello in cui viene chiamato. È possibile risolvere questo problema specificando esplicitamente l'ambito, o alla definizione della funzione o passando a eval. Cioè entrambe le seguenti frammenti di funzionare come previsto:

new Function("eval('window.foo = function(){ alert() }'); foo()")() 

new Function("eval('function foo(){ alert() }', this); foo()")() 

Questo comportamento sembra essere correlato alla modalità rigorosa, come ha spiegato la risposta qui "use strict"; + jQuery.getScript() = script can't export to global namespace.

+1

'eval' non è inteso per usare l'ambito globale, ma lo scope della funzione locale da quello che è stato chiamato (e in quello' foo() 'è chiamato). Anche il secondo snippet non ha senso, "eval" non prende un secondo parametro. – Bergi

+0

In realtà https://dev.mozilla.jp/localmdc/localmdc_3355.html. Tuttavia, il secondo argomento sembra essere stato deprecato, quindi non si dovrebbe fare affidamento sul fatto che sia implementato (anche se l'ho provato nell'ultima versione di Firefox e funziona) – taddeus

Problemi correlati