L'objet existe dans une certaine portée, de sorte que vous pouvez accéder à presque toujours la variable via cette syntaxe :
var objname = "myobject";
containing_scope_reference[objname].some_property = 'some value';
Le seul endroit où cela devient délicat est lorsque vous êtes dans une portée fermée et que vous voulez accéder à une variable locale de premier niveau. Lorsque vous avez quelque chose comme ceci:
(function(){
var some_variable = {value: 25};
var x = "some_variable";
console.log(this[x], window[x]); // Doesn't work
})();
Vous peut se déplacer qu'en utilisant eval
au lieu d'accéder à la chaîne de portée actuelle ... mais je ne le recommande pas, sauf si vous avez fait beaucoup de tests et savez que c'est la meilleure façon de faire les choses.
(function(){
var some_variable = {value: 25};
var x = "some_variable";
eval(x).value = 42;
console.log(some_variable); // Works
})();
Votre meilleur pari est d'avoir une référence à un nom dans un toujours en cours à être-là l'objet (comme this
dans la portée globale ou une variable de haut niveau privé dans une portée locale) et mettre tout d'autre part là-bas.
Ainsi:
var my_outer_variable = {};
var outer_pointer = 'my_outer_variable';
// Reach my_outer_variable with this[outer_pointer]
// or window[outer_pointer]
(function(){
var my_inner_scope = {'my_inner_variable': {} };
var inner_pointer = 'my_inner_variable';
// Reach my_inner_variable by using
// my_inner_scope[inner_pointer]
})();
@Shaz: Ha! Comment intelligent ... – PeeHaa
@Shaz - les deux font référence à la même portée en fait ;-) (En supposant qu'ils sont exécutés dans un navigateur.) 'Alert (this === window)'. –
@Sean: Ils sont. Et ils font? – PeeHaa