JavaScript passer portée à une autre fonction
Est-il possible de faire en quelque sorte passer le champ d'application d'une fonction à l'autre?
Par exemple,
function a(){
var x = 5;
var obj = {..};
b(<my-scope>);
}
function b(){
//access x or obj....
}
Je serais plutôt d'accéder aux variables directement, c'est à dire, ne pas utiliser quoi que ce soit comme this.a
ou this.obj
, mais il suffit d'utiliser x
ou obj
directement.
- Par la portée ne vous parle juste de méthodes ou également les valeurs de tous les initialisé dans un (variables, etc ? btw (+1) pour une bonne question.
- ce que u veux dire?
- Aussi, vous devez accepter les réponses à vos questions si vous avez trouvé pour être utile(Voir il y a une tique), et également utiliser upvotes. Il vous aidera à obtenir plus de réponses.
Vous devez vous connecter pour publier un commentaire.
La seule façon de vraiment obtenir l'accès à la fonction
a
's portée privée est de déclarerb
à l'intérieur dea
de sorte qu'il forme une fermeture qui permet l'accès implicite àa
's variables.Voici quelques options pour vous.
Accès Direct
Déclarer
b
à l'intérieur dea
.Si vous ne voulez pas
b
à l'intérieur dea
, alors vous pourriez avoir à l'intérieur d'un récipient plus grand champ d'application:Ce sont les seuls moyens que vous allez être en mesure d'utiliser
a
's variables directement dansb
sans code supplémentaire pour déplacer les choses. Si vous êtes satisfait avec un peu de "l'aide" et/ou d'indirection, voici quelques autres idées.Accès Indirect
Vous pouvez simplement passer les variables en paramètres, mais ne pas avoir l'accès en écriture à l'exception des propriétés des objets:
Comme une variation sur ce que vous pourriez obtenir l'accès en écriture par un passage à la mise à jour des valeurs de retour de
a
comme suit:Vous pouvez passer
b
un objet avec des getters et setters qui peuvent accéder àa
's variables privées:Les getters et setters pourrait être publique, affecté à la
this
objet dea
, mais de cette façon, ils ne sont accessibles que si explicitement à partir de l'intérieura
.Et vous pourriez mettre vos variables dans un objet et de passer de l'objet autour de:
Comme une variation, vous pouvez construire l'objet à l'heure de l'appel à la place:
Champ d'application est créé par des fonctions, et un champ d'application reste avec une fonction, de sorte que la chose la plus proche de ce que vous demandez sera de passer d'une fonction de
a()
àb()
, et que la fonction continueront à avoir accès à l'étendue des variables à partir dea()
.Tout
b()
n'ont pas un accès direct aux variables de la fonction transmise n', types de données lorsqu'une référence est passée, comme un Objet, peut être accessible si la fonction transmise retourne cet objet.a
dansb
? @gion sûr, d'accord. 🙂a++
.b
. De toute façon, je ne veux pas pinailler, j'ai essayé de vous aider à améliorer votre réponse.b()
parce que JavaScript est passé par valeur. La seule choseb()
sera jamais en mesure d'obtenir une copie de la valeur que lea()
références de fonction par l'intermédiaire d'une fonction d'intermédiaire. De la même fonction (ou un autre) peut remplacer la valeur avec une nouvelle valeur a passé deb()
, ou d'effectuer d'autres manipulations comme un++
. Il est à peu près tous le même concept. ;o)with
oueval
dans la portée locale en buggy navigateurs.Pas.
Vous êtes accédant à la portée locale de l'objet. Le
[[Context]]
.Vous ne peut pas publiquement accéder.
Maintenant, puisque c'est node.js vous devriez être en mesure d'écrire un C++ plugin qui vous donne accès à la
[[Context]]
objet. Je très recommander à l'encontre de ce qu'il apporte de propriété des extensions au langage JavaScript.[[Context]]
veuillez ne laissez-moi savoir.que sur l'utilisation de
bind
Comme d'autres l'ont dit, vous ne pouvez pas passer portée comme ça. Vous pouvez cependant la portée des variables correctement à l'aide de l'autonomie de l'exécution des fonctions anonymes (ou immédiatement exécuter si vous êtes pédant):
Error: window is undefined
this
estmodule
au lieu dewindow
donc il suffit d'écrire pour que. J'ai également très il est recommandé contre l'écrasementglobal
comme c'est le réel de portée mondiale dans node.js (et il peut avoir des effets secondaires inconnus)Je pense que la chose la plus simple que vous peut n'est passer des variables d'un champ d'application d'une fonction à l'extérieur de ce champ d'activité. Si vous passez par référence (comme les Objets), b a "accès" (voir obj.someprop dans ce qui suit):
b
fonction sera d'accéder à unea
etobj
, ne sont pas ceux dea
.x
.Vous ne pouvez pas passer la portée"... pas que je sache.
Vous pouvez passer de l'objet que la fonction fait référence à l'aide de
apply
oucall
et de l'envoyer à l'objet courant (this
) comme premier paramètre au lieu de simplement l'appel de la fonction:La seule façon pour une fonction permettant d'accéder à une certaine portée doit être déclaré dans le champ d'application.
Genre a difficile.
Cela mènerait à quelque chose comme :
Mais qui sorte de défaite la fin.
b(this)
ainsib.call();
. Justeb();
directement.Vous pouvez créer vos variables sans les
var
mot-clé et ils seront mondiale, mais pas moyen de passer le champ d'application que je suis au courant...Avez-vous essayé quelque chose comme ceci:
Si vous pouvez supporter la fonction B comme une méthode de la fonction de A, puis le faire:
this
à tous. Déclarant simplementb
à l'intérieur dea
automatiquement subventionb
accès àa
's variables privées. 2. À l'aide de lathis
mot-clé dansb
ne donnera pas accès aux variables privées afinthis.obj
sera pas défini dansb
.