Aug 18 2011

Évaluation indirecte en javascript

Category: JavaScript

La sortie du code Javascript suivant dans Firebug ou Node.js

var foo = 'foo';
(function() {
var foo = 'bar';
  ('blabla', eval)('console.log(foo)');
  (eval)('console.log(foo)');
})();
  
…est
foo
bar

Le premier eval s'effectue dans le scope global alors que le deuxième s'effectue dans le scope courant ; on dit que le premier est une évaluation indirecte.

On peut en déduire un moyen sûr pour obtenir l'environnement global dans lequel s'exécute un script Javascript :

var global = (function(){return this || (1, eval)('this');})();
  

Par exemple dans node.js

> (function(){return this || (1, eval)('this');})() === global
true
  

Alors que dans Firebug :

(function(){return this || (1, eval)('this');})() === window
true
  

Pour plus d'information sur l'évaluation indirecte on peut consulter cet excellent article.