2010-02-25 5 views
14

Possible en double:
How can I access local scope dynamically in javascript?Javascript: Accédez à la variable locale ou variable dans la fermeture par son nom

Salut à tous.
Nous savons tous que vous pouvez accéder à une propriété d'un objet javascript par son nom en utilisant la syntaxe [], par exemple. ob ['nameOfProperty']. Pouvez-vous faire de même pour une variable locale?

Une autre réponse here suggéré la réponse est d'utiliser la fenêtre ['nameOfVar']. Cependant, cela n'a fonctionné 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 Firefox Firebug (que je crois est écrit en javascript) peut afficher des variables locales et de fermeture. Y a-t-il une fonctionnalité de langage caché que je ne connais pas?

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(); 
+1

Voir http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript –

+0

Vous pouvez également jeter un coup d'œil sur http://stackoverflow.com/questions/ 1119335/javascript-variable-locale-déclarer http: // stackoverflow.com/questions/598878/how-i-access-local-scope-dynamiquement-en-javascript –

Répondre

13

Je ne suis pas au courant de quelque chose construit en JavaScript pour référencer des variables locales comme ça (bien qu'il devrait probablement être considéré toutes les variables sont référencées en interne par des chaînes).

Je vous suggère de garder toutes vos variables dans un objet si vous avez vraiment besoin d'un accès par chaîne:

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

Mise à jour: Ce genre de moi des bugs qu'il n'y a aucun moyen de le faire comme vous voulez. En interne, la variable est une liaison modifiable dans les enregistrements d'environnement déclaratif. Les propriétés sont liées à l'objet dont elles sont la propriété via les enregistrements d'environnement de l'objet, mais il existe en réalité un moyen d'y accéder en utilisant des parenthèses. Malheureusement, il n'y a aucun moyen d'accéder aux enregistrements d'environnement déclaratif de la même manière.

+0

Bob, moi aussi. C'est le fait qu'EcmaScript supporte cela en théorie mais pas l'implémentation (JavaScript). –

7

Accès à la variable fenêtre ou tout autre accesseur global ne fonctionnera pas parce que la variable est pas globalement accessible. Mais vous pouvez utiliser peut utiliser eval pour évaluer toute expression:

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

test(); 
</script> 
+0

Merci Pan. Je suppose que j'aurais dû être plus clair dans la question et dit sans utiliser eval. :-) On dirait que c'est la seule façon de faire ce que je veux sans modifier le motif. –

2

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

En d'autres termes, la seule façon d'accéder à j est d'y accéder à partir de quelque chose dans le domaine de test - via une fonction interne, ou autre. C'est parce que j, dans un sens, n'existe pas pour les objets avec une portée plus large, comme l'objet global. S'il en était autrement, les noms de variables devraient globalement être uniques.

2

Qu'en est-:

<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> 
+0

Puisque Func n'est pas un objet, cela pointe vers l'objet global. Vous dites essentiellement la fenêtre ['j'] – Bob

+0

@Bob, l'avez-vous essayé avant de downvoting moi? Parce que ça marche. – Mic

+0

@Bob, ok, je vous ai, vous avez raison – Mic

2

Non, cela est impossible en général. JavaScript résout les identifiants à l'intérieur d'une fonction en utilisant la chaîne de portée; il n'y a pas d'objet unique qui contient toutes les variables dans la portée, et les objets dans la chaîne de portée sont inaccessibles à partir de JavaScript s'exécutant dans la page.

Questions connexes