Forcer l’évaluation du code dans un contexte global en javascript

Par Jean-François VIAL, le jeudi 26 février 2009 – Mis à jour le Vendredi 17 avril 2009
Difficulté : 2/5 — Categorie : Choses utilesMots clés :

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à !

Commentaires

Ajouter un commentaire