2010-09-11 4 views
4

Je tente de déclarer une fonction en dehors de la fonction anonyme, mais ont encore acess à toutes les fonctions anonymes des variablesJavascript fonction des variables de changement de périmètre

Ci-dessous démontre ce dont je parle.

J'ai juste besoin de me débarrasser d'eval.

//Used to determine where the variable is being stored 
var variableScope = "global"; 

(function(window){ 
     var variableScope = 'insideFunction', 
     appearingToBeGlobalFunction = function(){ 
       alert("This Function appears Global but really isn't"); 
     }; 
     window["addFunction"]=function(funName,fun){ 
       //window[funName] = fun; Doesn't work 
       eval("window[funName]="+fun+";"); 
     } 
})(window); 

addFunction("alertTest",function(){ 
     alert(variableScope); 
     appearingToBeGlobalFunction(); 
}); 

//should alert "insideFunction" and "This Function appears Global but really isn't" 
alertTest(); 

Edit: L'objectif de cette question était de garder finalement la portée globale propre de tonnes de variables, mais la commodité d'accès, définissez et appelant comme si elles étaient mondiale. J'ai conclu qu'il y a un moyen de faire ce que je veux, mais il nécessite une fonctionnalité obsolète en javascript. Voici un exemple de code montrant comment accomplir ce qui précède sans évaluation. This article explique comment utiliser "avec".

var variableScope = "global"; 

var customScope = { 
     variableScope : 'insideFunction', 
     appearingToBeGlobalFunction : function(){ 
       alert("This Function appears Global but really isn't"); 
     } 
}; 

function alertTest(){ 
     with(customScope){ 
      alert(variableScope); 
      appearingToBeGlobalFunction(); 
     } 
}; 

//should alert "insideFunction" and "This Function appears Global but really isn't" 
alertTest();​ 
+0

Vous avez une variable locale avec le nom "appearingToBeGlobalFunction" ... c'est un paradoxe. Pourquoi pensez-vous que la fonction affectée à cette variable locale doit être globale? C'est local. –

+0

@ Šime Vidas: Il n'a pas utilisé 'var' pour définir cette variable, donc il est défini dans le contexte global. Il devrait être renommé 'apparingToBeGlobalFunctionAndActuallyIs'. –

+0

Oui, il l'a fait. Les variables "variableScope" et "apparing ..." sont des variables locales. (Remarquez la virgule séparatrice entre eux). http://stackoverflow.com/questions/694102/declaring-multiple-variables-in-javascript –

Répondre

2

Vous ne pouvez pas vous débarrasser d'eval et espérez toujours que cela fonctionne. C'est la seule façon de jeter un coup d'œil sur les membres de la portée après qu'elle a été «fermée». Par le passé, j'ai déjoué quelque chose avec similar, mais je ne l'utiliserais jamais nulle part. Envisagez une autre solution à tout ce que vous essayez d'accomplir.

0

vous pouvez forcer les variables à la portée globale, par exemple au lieu de var variableScope = 'insideFunction' vous utilisez window.variableScope = 'insideFunction'

+0

La solution ne devrait pas être d'introduire plus de variables globales. –

2
eval("window[funName]="+fun+";"); 

Oh Seigneur.

La raison pour laquelle cette « marche » est que vous convertissez la fonction fun (alertTest) dans une chaîne à mettre dans l'argument eval.

Il arrive que dans la plupart des navigateurs de bureau, le résultat d'une fonction JS native soit une chaîne qui ressemble à une expression de fonction contenant le même code que la déclaration d'origine. Vous retournez une fonction dans une chaîne et ré-analyse cette chaîne dans le contexte de la nouvelle fonction englobante, de sorte que la nouvelle valeur de la fonction est le même code mais avec une fermeture différente.

Cependant, il n'est pas nécessaire que Function#toString fonctionne comme ceci, et in some cases it won't. Il n'est pas sûr de s'appuyer sur la décomposition de fonction; éviter.

Vous pouvez certainement faire ce genre de hackery horrible en utilisant eval, bien qu'il n'y ait aucune raison que la partie window[funName]= doit être à l'intérieur du eval. window[funName]= eval('('+fun+')'); fonctionnerait aussi bien (mal).

Je tente de déclarer une fonction en dehors de la fonction anonyme, mais ont encore acess à toutes les variables fonctions anonymes

Whyever voulez-vous faire quelque chose de fou comme ça?

0

Le but de cette question était de garder la portée globale propre à partir de tonnes de variables, tout en ayant la commodité d'accéder, de définir et d'appeler comme si elles étaient globales. J'ai conclu qu'il y a un moyen de faire ce que je veux, mais il nécessite une fonctionnalité obsolète en javascript. Voici un exemple de code montrant comment accomplir ce qui précède sans évaluation. This article explique comment utiliser "avec".

var variableScope = "global"; 

var customScope = { 
     variableScope : 'insideFunction', 
     appearingToBeGlobalFunction : function(){ 
       alert("This Function appears Global but really isn't"); 
     } 
}; 

function alertTest(){ 
     with(customScope){ 
      alert(variableScope); 
      appearingToBeGlobalFunction(); 
     } 
}; 

//should alert "insideFunction" and "This Function appears Global but really isn't" 
alertTest();​ 
Questions connexes