2010-05-04 4 views
1

Je suis en train de retirer la plupart des globals de mon code en entourant tout dans une fonction, en transformant les globals en "pseudo globals", qui sont tous accessibles de n'importe où à l'intérieur de ce bloc fonctionnel.Accéder à "pseudo-globaux" par leur nom comme une chaîne

(function(){ 

var g = 1; 

var func f1 = function() { alert (g); } 

var func f2= function() { f1(); } 

})(); 

(techniquement c'est seulement pour ma version « release », où j'ajouter tous mes fichiers ensemble dans un seul fichier et les entourer de ce qui précède .... ma version dev a encore généralement un mondial par js fichier)

Tout cela fonctionne bien, sauf pour une chose ... il y a un endroit important où j'ai besoin d'accéder à certains de ces "globals" par le nom de la chaîne. Auparavant, je aurais pu faire ceci:

var name = "g"; 
alert (window[name]); 

et il a fait la même chose que

alert(g); 

maintenant - à l'intérieur du bloc - Je voudrais faire la même chose, sur mes pseudo-GLOBALS . Mais je ne peux pas, car ils ne sont plus membres d'un objet parent ("fenêtre"), même si elles sont dans la portée.

Un moyen d'y accéder par chaîne?

Merci ...

Répondre

1

En fait non, comme une réponse indirectement par cette question: Javascript equivalent of Python's locals()?

Votre seule option serait d'utiliser eval, qui est généralement pas une bonne idée ou même en toute sécurité, comme décrit dans cette question: Why is using the JavaScript eval function a bad idea?

Si le nom de la chaîne de ces variables est vraiment et réellement défini de manière sûre (par exemple, pas par l'intermédiaire de l'entrée de l'utilisateur ou quoi que ce soit), alors je recommande d'utiliser eval. Assurez-vous d'y réfléchir très longuement et de savoir s'il n'y a peut-être pas de meilleure façon de le faire.

+0

Ahh, oui, eval. Je ne sais pas pourquoi je n'y ai pas pensé.Mais oui, je ne pense pas que je veuille y aller. :) – rob

+1

Y at-il une raison pour laquelle il ne peut pas simplement nommer la fonction qu'il utilise pour envelopper le code, puis accéder au "global" en tant que membre de cet objet? C'est ce que je suggère dans ma réponse, je suis juste curieux de savoir s'il y a quelque chose qui me manque que vous pourriez expliquer. – MisterMister

+0

@MisterMister: Cela peut très bien être une bonne approche, en fonction des spécificités de son code, comment il est structuré, et exactement pourquoi il doit accéder à un global par un nom de chaîne, et combien refactoring serait nécessaire pour faire cette approche fonctionne. Sans ces détails, je ne sais pas vraiment ce qui serait le mieux, bien que votre réponse soit en général une bonne approche. –

0

Si vous voulez accéder à quelque chose dans une portée globale, vous devez mettre quelque chose là-bas. dans votre cas, c'est probablement un objet qui référence votre fonction fermée.

var obj1 = new (function(){ 

var g = 1; 

var func f1 = function() { alert (g); } 

var func f2= function() { f1(); } 

})(); 

vous pouvez ajouter une méthode ou une propriété comme getter pour g. si la valeur de g n'est pas constante que vous pourriez faire comme

this.getG = function() { return g; }; 

vous pouvez travailler à partir de là pour accéder aux éléments par nom, comme

alert(obj1["getG"]()); 
alert(window["obj1"]["getG"]()); 
1

Vous pouvez nommer la fonction que vous utilisez pour envelopper la code entier.

Ensuite, définissez la variable "global" en tant que membre de cette fonction (rappelez-vous que les fonctions sont des objets en JavaScript).

Ensuite, vous pouvez accéder à la variable exactement comme vous le faisiez auparavant .... il suffit d'utiliser le nom de la fonction au lieu de "fenêtre".

Il ressemblerait à quelque chose comme ceci:

var myApp = new (function myApp(){ 

    this.g = "world"; 

    //in the same scope 
    alert ("Hello " + this["g"]); 

})(); 

//outside 
alert ("Hello " + myApp["g"]); 
Questions connexes