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:
- portée globale si elles ont été définies par
function X(){}
;
- 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.
Parce que Safari est le nouveau Internet Explorer –