Javascript: accédez à la variable locale ou à la variable en cliquant par son nom

Duplication possible:
Comment puis-je accéder dynamiquement à la portée locale sous javascript?

Salut à tous.
Nous savons tous que vous pouvez accéder à une propriété d'un objet javascript par son nom en utilisant la syntaxe [] [p. Ex. Ob ['nameOfProperty'].

Pouvez-vous faire de même pour une variable locale? Une autre réponse suggère ici que la réponse est d'utiliser la fenêtre ['nameOfVar']. Cependant, cela ne fonctionnait que pour l'affiche car il définissait des variables au niveau de la fenêtre.

Je suppose que cela doit être possible en général, car Firebug de Firefox (ce qui, je crois, est écrit en javascript) peut afficher des variables locales et de fermeture. Y at-il une fonctionnalité de langage caché dont je ne suis pas au courant?

Plus précisément, voici ce que je veux faire:

var i = 4; console.log(window['i']); // this works.. function Func(){ var j = 99; // try to output the value of j from its name as a string console.log(window['j']); // unsurprisingly, this doesn't work } Func(); 

Je ne suis pas au courant de tout ce qui a été intégré dans JavaScript pour faire référence à des variables locales comme celle-ci (bien qu'il soit probablement envisageable que toutes les variables soient référencées en interne par des chaînes).

Je suggérerais de garder toutes vos variables dans un objet si vous avez vraiment besoin d'accéder par chaîne:

 var variables = { "j": 1 }; alert(variables["j"]); 

Mise à jour: Il me gêne qu'il n'y a aucun moyen de faire cela comme vous le souhaitez. En interne, la variable est une liaison mutable dans les enregistrements de l'environnement déclaratif. Les propriétés sont liées à l'objet dont elles appartiennent à travers les enregistrements environnementaux de l'objet, mais il existe actuellement un moyen d'y accéder en utilisant des parenthèses. Malheureusement, il n'y a aucun moyen d'accéder aux enregistrements environnementaux déclaratifs de la même manière.

L'accès à la variable avec une fenêtre ou tout autre accesseur global ne fonctionnera pas car la variable n'est pas accessible au monde entier. Mais vous pouvez utiliser peut utiliser eval pour évaluer toute expression:

 <script> function test(){ var j = 1; alert(eval("j")); } test(); </script> 

Qu'en est-il de:

 <script> function Func(){ var fn = arguments.callee; fn.j = 99; console.log(fn['j']); } Func(); console.log(window['j']); //not global console.log(Func['j']); //but not private </script> 

Non, ce n'est pas possible en général. JavaScript résout les identifiants dans une fonction en utilisant la chaîne de portée; Il n'y a pas d'objet unique contenant toutes les variables dans la portée et les objets dans la chaîne de portée sont inaccessibles à partir de JavaScript en cours d'exécution dans la page.

Non, car la variable n'est accessible que dans les contextes d'exécution qui contiennent la portée de la variable.

Autrement dit, la seule façon d'accéder à j est si vous accédez à quelque chose dans la portée du test – par une fonction interne ou autre. C'est parce que j , en un sens, n'existe pas dans des objets de portée plus large, comme l'objet global. S'il en était autrement, les noms de variables devraient globalement unique.