8
votes

Variable locale JavaScript Declare

Il s'agit essentiellement d'une question de savoir comment accéder à un gestionnaire de portée local. J'essaie d'obtenir quelque chose de similaire pour la définition de variable globale comme: xxx

mais pour la portée locale. En ce moment, seule la solution que j'ai utilise des devises: xxx

mais c'est une solution vraiment laid ... la meilleure serait comme en utilisant une référence à une portée locale comme dans une fenêtre [] solution, mais je n'ai jamais entendu parler d'aucune référence à la portée locale ... des idées?

Exemple va ici: xxx


2 commentaires

8 Réponses :


1
votes

Je dois manquer quelque chose. Comment est ce que vous voulez différent de faire: Strike>

function doSomething(name, value)
{
  var X = {};
  X[name] = value;
  if (X.foo == 26)
    alert("you apparently just called doSomething('foo',26)");
}


2 commentaires

Oui - Je veux faire cela correspondant de manière dynamique aux données que je reçois à cette fonction.


Je veux dire - oui tu manques quelque chose là-bas. J'ai besoin d'une variable locale définissant de manière dynamique;)



0
votes

question intéressante, jamais pensé à quelque chose comme ça. Mais quelle est l'usecase?

La raison pour laquelle vous voudriez faire quelque chose comme ça, est si vous ne connaissez pas le nom de la variable. Mais dans ce cas, le seul moyen d'accéder à la variable à nouveau utiliserait le même objet de référence. C'est à dire. Vous pouvez simplement utiliser n'importe quel objet ancien pour stocker des données dans.

lire à partir d'un tel objet de référence serait intéressant à des fins de débogage, mais je ne vois pas pourquoi vous voudriez y écrire.

EDIT:

L'exemple que vous avez posté ne me convainc pas de la nécessité d'avoir accès à la portée locale, car vous avez toujours le nom sexe codé dur dans l'alerte. Cela pourrait être mis en œuvre comme: xxx

Pourriez-vous élaborer davantage sur l'exemple?


4 commentaires

L'exemple n'est pas convaincant que cela soit nécessaire. Je travaille sur le système de modèle et explique pourquoi j'ai besoin de cela prendrait beaucoup de temps et serait vraiment compliqué :)


J'ai juste besoin de pouvoir appeler (alerte (sexe)) où le nom de la variable peut être prélevé de la source extérieure;)


Ah, donc ce qu'il va, c'est que votre système de modèle ne permet pas des points dans des alertboxes? ;-) sinon, alerte (obj.someobj) fonctionne simplement.


Il permet à des points ... Mais j'essaie de remplacer un système de métro de mauvais modèle et j'ai besoin de prendre en charge que vous pouvez mettre des variables de la portée locale où vous souhaitez obtenir ce modèle.



1
votes

Pourquoi ne pas créer un objet dans la portée locale, puis l'utiliser comme conteneur pour toutes les variables que vous souhaitez créer de manière dynamique?

function x(arg)
{
    var localSpace = {};
    localSpace[arg.name] = arg.value;
}


2 commentaires

Mais je dois être capable de faire référence à l'élément comme un nom, pas avec LocalSpace [Nom] avant chaque variable ...


Parce que les tiers voudraient faire référence à des modèles à leurs propres valeurs de la portée locale ... bien expliquer cela est vraiment compliqué, mais je peux être sûr de vous que vous n'ayez aucune autre façon de ne pas cela que par une portée locale étendue (ou globale mais avec un accès plus long aux variables).



1
votes

OKEY J'ai trouvé une question connexe qui parle de ce dont j'ai besoin ...

Comment puis-je accéder à la portée locale de manière dynamique dans JavaScript?

Je me rappelle juste que dans ECMA 262 n'est qu'un moyen d'ajouter des variables locales dynamiquement à la portée de l'utilisation de" avec " Déclaration (et eval bien sûr), voici la solution: xxx


7 commentaires

La seule chose que ce avec le bloc vous donne, est que vous n'avez pas à écrire d'une alerte (obj.someobj) . Au détriment de l'ajout de trois lignes de code supplémentaires.


"Avec" est une mauvaise chose à utiliser. Voir yuiblog.com/blog/2006/04/ 11 / AVEC-ÉLIME-CONDITION - CONSIDÉRÉE-HARMFU L et développeur.mozilla. org / fr / core_javascript_1.5_guide / ...


Oui - ces deux problèmes: la lisibilité et un peu plus lent d'accès local local est abordable avec le système de modèles que je dois créer.


Attendez: D'où vient le code "alerte (someobj)"? Êtes-vous en train d'écrire vous-même ou est-ce que ce code généré automatiquement? Pourquoi ne pouvez-vous pas utiliser alerte (obj.someobj)?


@Jason S: Exactement mon point, il semble que l'OP ne puisse pas non plus générer cela, ni le trouve "trop ​​de code" pour taper. Je dirais ajouté l'extra " obj. " - le préfixe est plus clair, car les arguments réels de la fonction ne sont pas dans la portée: alerte (fakescope.myvar);


Le contenu de l'alerte serait en dehors d'une fonction et ferait référence à quelque chose de la portée locale qui devrait être transmis à la fonction ... C'est vraiment compliqué de vous dire pourquoi est-ce :)) vraiment :)


avec ne pas injecter des variables dans la portée locale; Cela crée une nouvelle portée et la pousse sur la pile. Seuls var et laisse insérer des variables dans la portée actuelle.



-1
votes

Je ne suis pas entièrement sûr de comprendre votre question. Lors de la création d'une classe X, je fais généralement cela: xxx

Vous pouvez continuer à accéder à _self et args car il est fermé par les fonctions contenues.


2 commentaires

Évitez d'évaluer à tout prix (parfois vous ne pouvez pas). En l'évitant, vous permettrez de meilleures possibilités de minécrificité.


Je demande quelque chose de complètement différent - comment créer de manière dynamique une variables dans la portée locale - que vous pouvez taper des alertes (sexe) où "sexe" est créé de manière dynamique dans la portée locale



1
votes

vous pouvez essayer le tour des arguments nommé
EDIT: Ce n'est pas un navigateur croisé

function x( {sex:sex, height:height} ) {
    alert( sex );
    alert( height );
}

x( { sex: 'male', height: 'short' } );
x( { height: 'medium', sex: 'female' } );

// male
// short
// female
// medium


5 commentaires

Intriguant ... est-ce ECMAScript, ou simplement un dialecte particulier? (E.G. Spidermonkey depuis qu'il semble fonctionner avec SpiderMonkey 1.7)


Intéressant .. j'ajoute +1 :)


Cela fait partie de JS1.7 et s'appelle la déstructivation. Vous pouvez simplifier cette déclaration de fonction à: fonction x ({sexe, hauteur}) {...}


Doc sur la déstructuration, c'est à désactivation . Malheureusement, ce n'est pas une partie de l'ECMA 5, mais c'est dans le Propositions d'harmonie donc cela pourrait se présenter à l'avenir.


Cela ne résout pas la question de l'OP, car ils pouvaient aussi bien faire fonction x (sexe, hauteur) et l'appelez de manière appropriée ...



6
votes

Ce que vous cherchez est appelé l'objet appel . Mais selon Ce , vous ne pouvez pas y accéder directement, alors vous n'avez pas de chance.


3 commentaires

Je n'ai jamais entendu le terme appel d'appel avant, mais le lien que vous avez fourni était utile. Il ressemble à un détail de mise en œuvre JavaScript pour décrire la portée locale d'une fonction (pouvant échapper à la portée "locale" en étant capturé dans une fermeture). Cependant, je ne pense pas que cela a beaucoup à voir avec la question initiale.


À la deuxième pensée, si vous pourriez-vous accéder directement à ce détail de mise en œuvre, il serait pertinent pour la question, alors vous avez donc raison à cet égard.


Droit; Si vous le pouviez, vous pouvez faire ce qu'il demande: "LocalScope [nom] = valeur;"



1
votes

Vous ne savez pas ce dont vous avez besoin exactement, mais voici mes 2 cents.

Le seul moyen de créer de manière dynamique des vars dans une fonction existante est la méthode d'évaluation que vous avez déjà mentionnée.

Une autre option ( mentionné par d'autres) est que votre fonction prend une carte de contexte et le modèle l'accède à la notation de points (context.var1)

Ma suggestion finale est le constructeur de fonctions. Mais j'ai un sentiment que cela peut être ce que vous recherchez. (Notez que le constructeur de fonctions souffre des mêmes problèmes qu'un appel d'évaluation) xxx

espère qu'il aide


0 commentaires