2017-09-04 2 views

Répondre

2

Je soupçonne que l'utilisation const (ou let) met cette variable dans une portée interne eval, tandis que les fonctions appelées eval utilisent:

  1. portée globale si elles ont été définies par function X(){};
  2. portée interne si elles ont été définies comme const X = function(){}.

Par exemple, en utilisant const:

> eval('const a = function(){ return 42; }; a();') 
42 
> a 
ReferenceError: Can't find variable: a 

En utilisant var:

> eval('var a = function(){ return 42; }; a();') 
42 
> a 
function(){ return 42; } 

À l'appui de cette théorie:

> eval('const a=function(){return 42;}; const b=function(){return a();}; b();') 
42 
> a 
ReferenceError: Can't find variable: a 
> b 
ReferenceError: Can't find variable: b 

Donc, cela fonctionne si nous définissons les deux fonctions de la même manière.

Maintenant, nous allons faire définir la fonction a portée mondiale, sans utiliser eval:

> a = function(){ return 23;} 

Et nous allons exécuter du code eval de votre question (ajout return s aux deux fonctions):

> eval("const a = function(){return 42;}; function b(){return a();}; b();") 
23 

Comme vous pouvez le voir, la fonction b utilise a de portée globale.

+0

Super! Pour une raison quelconque, Safari ne crée pas de fermeture pour la fonction 'b' avec les variables locales définies pendant' eval() ', ce qui est différent pour Chrome. Je ne suis pas sûr de ce qui est le comportement correct, bay damn vous Safari pour perdre mon temps! – agoldis