Fonction Javascript Du Pointeur De La Cession
Considérer ce code javascript:
var bar = function () { alert("A"); }
var foo = bar;
bar = function () { alert("B"); };
foo();
Lors de l'exécution de ce code j'obtiens un "Un". Est-ce le comportement d'une partie de javascript spécification et je peux compter sur elle?
Vous devez vous connecter pour publier un commentaire.
Oui, c'est prévu et voulu par la conception.
Votre question est fondamentalement: ne
foo
référencebar
comme un pointeur ou une référence dans une autre langue?La réponse est non: le valeur de
bar
au moment de la cession est attribué àfoo
.foo = bar
, foo reçoit une copie par valeur de ce pointeur, donc, à la fois foo et bar du point de la fonction autonome de l'objet.Dans d'autres exemples, rien n'a été transmis par valeur; tout a été passé par référence.
bar et toto sont DEUX pointeurs
Tous vars/poignées de NON primitive des objets en javascript sont des pointeurs; les pointeurs SONT originaires de javascript, ils sont la valeur par défaut.
Vous allez courir dans caché des erreurs et des bugs si vous pensez qu'ils sont des copies. Surtout si vous travaillez avec des objets complexes. Par exemple
Vraiment de la COPIE d'un non-primitif en javascript faut plus de travail que de simplement a = b.
Par exemple:
Je suis un peu en retard ici mais j'ai pensé que je donnerais une réponse de toute façon et la chair de quelque chose.
Il est préférable de ne pas penser en termes de pointeurs et les références de mémoire lors de la discussion de l'intérieur de JavaScript (ou ECMAScript) lors du traitement avec le cahier des charges. Les Variables d'environnement sont des dossiers en interne et sont stockés et référencé par son nom, pas d'adresse de mémoire. Ce que votre instruction d'affectation est en train de faire, en interne et par sa conception, est à la recherche de l'environnement enregistrement de nom ("foo", "bar") et de l'affectation de la valeur de cet enregistrement.
Donc,
est l'assignation de l'environnement d'enregistrement "bar" de la valeur (fonction anonyme).
appelle en interne GetValue("bar") qui récupère la valeur associée à l'enregistrement de "bar" et ensuite les associés de cette valeur avec le dossier "toto". Donc, par la suite la valeur d'origine de la barre peut encore être utilisé comme il est maintenant associé avec foo.
Parce que JavaScript références par chaîne et non l'adresse de mémoire est précisément la raison pour laquelle vous pouvez faire des choses comme ceci:
qui est à la recherche de la valeur basée sur le nom de la propriété.
Oui, il n'y a rien de spécial sur le fait que les variables se référant à des fonctions, il n'y a pas d'aliasing impliqués.
Vous affectez la valeur d'une fonction anonyme pour une variable non un pointeur.
Si vous voulez jouer avec des pointeurs, vous pouvez utiliser les objets sont passés par référence, pas de copie.
Voici quelques exemples:
"obj2" est une référence de la "obj1", vous changez de "obj2", et "obj1" est modifié. Il alertera
false
."prop" points à une propriété qui n'est pas un objet, "prop" n'est pas un pointeur vers cet objet, mais une copie. Si vous changez de "prop", "obj1" n'est pas modifiée. Il alertera
true
"obj2" est une référence à la "subObj" propriété de "obj1". si "obj2" est changé, "obj1" est modifié. Il alertera
false
.Oui, c'est le comportement correct.
Ceux qui ne sont pas des pointeurs de fonction (et il n'y a pas de pointeurs en JS natif). Fonctions JS peuvent être anonymes et sont des objets de première classe. Donc
crée une fonction anonyme qui les alertes "Une" sur l'exécution;
affecter cette fonction à la barre;
attribuer foo bar, ce qui est la fonction "A".
relier la barre à une fonction anonyme "B". Ce qui n'affecte pas ou toto ou l'autre fonction "Une".
Appel de la fonction stockée dans foo, qui est la fonction "Un".
Fait dans les langues où il y a des points de fonction, par exemple C, cela n'affectera pas
foo
soit. Je ne sais pas d'où vous est venue l'idée de "B" à la réaffectation.C'est l'affectation d'une variable à une fonction sans nom, pas un pointeur vers une fonction
Oui, vous avez créé un pointeur à l'original de la "Une" de la fonction. Lorsque vous réaffectez barre, vous êtes réaffectation des, mais vous êtes toujours en laissant toutes les références à l'ancien seule fonction.
Donc, pour répondre à votre question, oui, vous pouvez compter sur elle.
Je voudrais juste ajouter ceci fonctionne également pour les pré-défini les fonctions nommées ainsi:
Cela va faire la même chose, indiquant que les noms de fonctions agissent comme des tableaux de noms (pointeurs).
Références