Il s'agit d'un article sur le débogage avec JScript RuntimeObject (MSDN). Bien que la plupart de ces exemples ne fonctionnent pas dans d’autres navigateurs, ils fonctionneront dans IE 5.5+.
Fuite de l'identifiant global
Par exemple, disons que vous créez accidentellement une propriété globale, telle que :
fonction playRugby(joueurs) {
articles variés,
je;
len = articles.longueur;
// Mondial.
}
fonction coup de pied() {
variable x = 10
y = 11 ;
// Comme je rend y global.
}
Lorsque playRugby est appelé, la propriété globale len est créée, et si elle n'existe pas déjà, la valeur de items.length lui est attribuée. De même, lorsque kick est appelé, la propriété globale y est créée.
Aucune de ces variables globales n’est intentionnelle. Ils brisent l'encapsulation et révèlent les détails de l'implémentation. Cela peut conduire à des conflits et à des problèmes de dépendance délicats.
Pour détecter ces identifiants globaux créés par inadvertance, nous pouvons utiliser une boucle for in sur l'objet global. La balise "DOM" de Firebug fournit cette détection globale utile.
Malheureusement, dans IE, for in ne peut énumérer aucune variable globale ni déclaration de fonction. Jetez un œil à l’exemple suivant :
// Propriété de l'objet variable globale.
var EX1_GLOBAL_VARIABLE = 10 ;
// Propriété de l'objet global.
this.EX1_GLOBAL_PROPERTY = 11 ;
// Propriété de l'objet variable globale.
fonction EX1_GLOBAL_FUNCTION(){}
(fonction(){
var résultats = [];
pour (var p dans ceci) {
résultats.push(p);
}
alert("Fuite :n" + results.join("n"));
})();
Dans IE, le résultat contient une combinaison de propriétés de fenêtre et l'une des quatre propriétés définies par l'utilisateur : EX1_GLOBAL_PROPERTY.
Alors, qu’arrive-t-il aux trois autres propriétés définies par l’utilisateur ? Pourquoi n'apparaissent-ils pas dans une boucle for in.
Il s'avère que l'énumération d'un objet global énumère les propriétés de l'objet global attribuées mais pas les variables globales.
Pourquoi les propriétés globales peuvent être énumérées mais pas les variables globales. L'expérience nous dit que JScript marque les variables globales (déclarées avec var) comme DontEnum. Puisque les objets globaux sont définis comme des objets variables globaux, cela semble être une explication raisonnable. Ce n'est pas standard mais explique le comportement dans IE. Cependant, Eric Lippert a proposé une autre explication : les objets globaux et les objets variables globales sont deux objets différents dans IE.
Selon MS-ES3 :
La déclaration de variable dans JScript 5.x crée une propriété de l'objet global, qui possède l'attribut DontEnum.