2017-09-14 1 views
1

J'ai donc ce morceau complètement légitime de code qui utilise ES6 paramètre par défaut:Eval en safari jette une erreur sur le code de bonne ES6

const foo = 5; 
function test(bar = foo) { return bar }; 
test(); 

Il fonctionne correctement lorsqu'il est exécuté dans la console de Safari.

Cependant le même morceau de code, lorsqu'il est utilisé dans une fonction eval, comme suit:

eval('const foo = 5; function test(bar = foo) { return bar }; test();'); 

jette l'erreur suivante:

ReferenceError: Can't find variable: foo

je suis tombé sur cette quand on travaille avec WebPack sourcemaps (eval-source-map) qui génèrent du code enveloppé dans eval comme ceci, et il casse le paquet généré.

Je me demandais pourquoi cette incohérence?

testé dans Safari v 10.1.2

+2

Semble fonctionner dans Safari 11, donc ce pourrait être juste un bogue. – pvg

+0

Ressemble à un bug lié aux mots clés 'const' /' let'. Apparaît pour travailler avec 'var' dans Safari 10. –

+0

@PatrickKunka Oui cela fonctionne avec Var, semble peut-être problème avec des variables de portée de bloc – Kicu

Répondre

0

Il semble être un bug lié à l'utilisation du scope bloc const/let, et le fait que le code est en cours d'évaluation dans la portée globale.

J'ai trouvé deux arounds de travail:

1: utiliser var:

eval('var foo = 5; function test(bar = foo) { return bar }; test();'); 

2: Utilisez const, mais exécuter dans une fermeture. Par exemple, le même code à l'intérieur d'un IIFE semble fonctionner:

eval('(function(){const foo = 5; function test(bar = foo) { return bar }; return test();})()');