Forcer l’évaluation du code dans un contexte global en javascript
Lors d'un appel de la fonction javascript eval, l'évaluation est faite à l'intérieur du contexte courant... sauf si on fournit à eval un référentiel de contexte différent. De même, lorsqu'une variable est créée à l'intérieur d'une fonction, elle ne survit pas à la fin de cette fonction.
Par exemple, lors de l'utilisation d'une objet XMLHTTPRequest avec Prototype, comme suit :
var mavairable = 1; function ajax() { new Ajax.Request('moncgi.php',{ method: 'get', onSuccess: function (t) { var scripts = t.responseText.extractScripts(); var r = scripts.map(function(script) { return eval(script); }); }, onException: function (xhr,e) { alert('Une erreur est survenue...\n'+e.toQueryString); } }); }
si la réponse du cgi est un script du type :
mavariable = 10;
la valeur de la variable mavariable restera à 1...
Pour faire en sorte qu'eval puisse "toucher" aux variables du contexte global, il "suffit" d'employer l'une ou l'autre des méthodes suivantes :
1. utiliser l'objet window
window.eval(script)
En faisant celà, le code est rattaché au contexte de l'object window… et c'est justement dans ce contexte que s'exécutent tous les autres.
2. utiliser un objet global
var global = this; // à placer dans le contexte global global.eval(script); // à placer dans le contexte du XHR par exemple
Même chose que précédemment l'object ainsi créé est une instance de l'objet "window" (le this).
Voilà !







