j'ai remarqué une étrange (et à ma connaissance un comportement non défini, par l'ECMA 3.0 Spec au moins), prenez l'extrait suivant:Comportement des variables locales JavaScripts avec() - déclaration
var foo = { bar: "1", baz: "2" };
alert(bar);
with(foo) {
alert(bar);
alert(bar);
}
alert(bar);
Il plante en Firefox et Chrome, car "barre" n'existe pas dans la première alerte(); déclaration, c'est comme prévu. Mais si vous ajoutez une déclaration de bar à l'intérieur de la avec() - déclaration, il ressemble à ceci:
var foo = { bar: "1", baz: "2" };
alert(bar);
with(foo) {
alert(bar);
var bar = "g2";
alert(bar);
}
alert(bar);
Il produira les résultats suivants:
undefined, 1, g2, undefined
Il semble que si vous créez une variable à l'intérieur d'une déclaration with() - la plupart des navigateurs (testés sur Chrome ou Firefox) feront en sorte que cette variable existe aussi en dehors de cette portée, elle est simplement définie sur undefined. Maintenant, de mon bar en perspective devrait exister que dans le avec() - déclaration, et si vous faites l'exemple encore plus étrange:
var foo = { bar: "1", baz: "2" };
var zoo;
alert(bar);
with(foo) {
alert(bar);
var bar = "g2";
zoo = function() {
return bar;
}
alert(bar);
}
alert(bar);
alert(zoo());
Il produira ceci:
undefined, 1, g2, undefined, g2
Ainsi, le bar
intérieur l'instruction with() n'existe pas en dehors de celle-ci, mais l'exécution crée automatiquement une barre nommée variable qui n'est pas définie dans sa portée de niveau supérieur (global ou fonction) mais cette variable ne fait pas référence à la même qu'à l'intérieur l'instruction with() -, et cette variable n'existera que si une instruction with() - a barre nommée fiable qui est défini à l'intérieur.
Très étrange, et incohérent. Quelqu'un at-il une explication à ce comportement? Il n'y a rien dans l'ECMA Spec à ce sujet.
Bonne explication. Et une autre bonne raison de ne pas utiliser 'avec '! – bobince