Deux fonctions avec le même nom en JavaScript - comment cela peut-il fonctionner?
Autant que je sache, function foo() { aaa(); }
est juste var foo = function(){ aaa() }
en JavaScript. Ainsi, l'ajout de function foo() { bbb(); }
devrait remplacer le foo
variable, ou d'ignorer la deuxième définition - qui n'est pas le point. Le point est qu'il doit y avoir une variable foo
.
Donc, dans cet exemple, le me
variable doit pas être correctement résolus à partir à l'intérieur de l'méthodes et il n'est pas à Explorer 8 🙂. J'ai pris cette exemple en essayant de les envelopper dans une autre fermeture d'où ( var
) me
, mais j'ai été surpris qu'il n'est pas nécessaire:
var foo = {
bar1 : function me() {
var index = 1;
alert(me);
},
bar2 : function me() {
var index = 2;
alert(me);
}
};
foo.bar1(); //Shows the first one
foo.bar2(); //Shows the second one
Démo: http://jsfiddle.net/W5dqy/5/
J'ai lu votre question 3 fois et je ne comprend toujours pas votre problème
C'est un peu ésotérique question de savoir quand et comment les noms de fonction sont créés et ce qu'ils ont. Et oui, c'est un peu difficile à suivre. 🙂
Je suis désolé si le problème est dans mon anglais, je ne suis pas un locuteur natif.
C'est un peu ésotérique question de savoir quand et comment les noms de fonction sont créés et ce qu'ils ont. Et oui, c'est un peu difficile à suivre. 🙂
Je suis désolé si le problème est dans mon anglais, je ne suis pas un locuteur natif.
OriginalL'auteur tillda | 2011-02-28
Vous devez vous connecter pour publier un commentaire.
Qui est en fait incorrect. JavaScript a deux différents, mais liés choses: la Fonction déclarations, et la fonction expressions. Ils se produisent à différents moments dans le cycle d'analyse et ont des effets différents.
C'est une fonction déclaration:
Les déclarations de fonction sont traitées lors de l'entrée dans le cadre englobant, avant toute étape-par-étape de code est exécuté.
C'est une fonction expression (plus précisément, un anonyme):
Les expressions de fonction sont traitées dans le cadre de l'étape-par-étape de code, à l'endroit où ils apparaissent (comme toute autre expression).
Votre code est cité à l'aide d'un fonction nommée expression, qui ressemble à ceci:
(Dans votre cas, c'est l'intérieur d'un objet littéral, donc, c'est sur le côté droit d'une
:
au lieu d'une=
, mais c'est toujours une fonction nommée expression.)C'est parfaitement valide, ignorant la mise en œuvre de bugs (plus dans un instant). Il crée une fonction avec le nom
foo
, n'est pas mettrefoo
dans le cadre englobant, et attribue alors que la fonction de lax
variable (tout ce qui se passe lorsque l'expression est détectée dans l'étape-par-étape de code). Quand je dis qu'il n'a pas misfoo
dans le cadre englobant, je veux dire exactement que:Remarque comment c'est différent de la façon dont la fonction déclarations de travail (d'où le nom de la fonction est ajouté à l'affichage de la portée).
Fonction nommée expressions de travailler sur des versions compatibles. Historiquement, il y avait des bugs dans les implémentations (début Safari, IE8 et plus tôt). Les implémentations modernes se tromper, y compris IE9 et. (Plus de détails ici: deux et ici: nom de fonction expressions démystifié.)
En fait, il devrait être. Une fonction est le vrai nom (le symbole entre
function
et l'ouverture de la parenthèse) est toujours portée au sein de la fonction (si la fonction est à partir d'une déclaration ou d'une fonction nommée expression).NOTE: La ci-dessous a été écrit en 2011. Avec les progrès de JavaScript depuis, je n'en ressens plus le besoin de faire des choses comme la ci-dessous, sauf si je sais que je vais avoir affaire avec IE8 (ce qui est très rare de nos jours).
En raison de la mise en œuvre de bugs, j'ai utilisé pour éviter nommé les expressions de fonction. Vous pouvez le faire dans votre exemple en supprimant simplement les
me
noms, mais Je préfère les fonctions nommées, et donc, pour ce que ça vaut, voici comment j'ai utilisé pour écrire votre objet:(Sauf que je serais probablement utiliser un nom plus court que
publicSymbols
.)Voici comment est traitée:
var foo = ...
ligne est rencontré dans l'étape-par-étape de code, et puis il est appelé (parce que j'ai la()
à la fin).bar1_me
etbar2_me
fonction déclarations sont traitées et les symboles sont ajoutés à la portée à l'intérieur de cette fonction anonyme (techniquement, à la variable objet pour le contexte d'exécution).publicSymbols
symbole est ajouté à la portée à l'intérieur de la fonction anonyme. (Plus: Pauvres incomprisvar
){}
àpublicSymbols
.publicSymbols.bar1 = bar1_me;
etpublicSymbols.bar2 = bar2_me;
, et enfinreturn publicSymbols;
foo
.Ces jours, sauf si je suis à l'écriture de code, je sais besoins de soutien IE8 (malheureusement, comme je l'ai écris cela en novembre 2015, il a encore d'importantes parts de marché mondial, mais, heureusement, c'est plummetting), je ne vous inquiétez pas à ce sujet. Tous les moteurs JavaScript comprendre l'amende juste.
Vous pouvez aussi écrire que comme ceci:
...puisque ce sont les déclarations de fonction, et donc sont hissés. Je n'ai pas l'habitude de faire comme ça, que je trouve plus facile de faire de la maintenance sur les grandes structures si je ne la déclaration et l'affectation de la propriété à côté de l'autre (ou, si ce n'est pas écrit pour IE8, sur la même ligne).
OriginalL'auteur T.J. Crowder
Les deux
me
recherches, sont visibles uniquement/disponible à l'intérieur de l'expression de fonction.Enfaite ces deux sont nommé les expressions de fonction, et la spécification ECMAscript nous dit, que le nom d'une expression n'est pas exposé à la ces appelle
Variable object
.Et bien j'ai essayé de mettre ça en quelques mots, mais tout en essayant de trouver les bons mots, cela se termine en assez profonde de la chaîne d'ECMAscript comportement. Donc,
function expression
sont pas stockées dans unVariable
/Activation Object
. (Conduirait à la question, qui ces gars-là sont...).Court: Chaque fois qu'une fonction est appelée, un nouveau
Context
est créé. Il y a des "blackmagic le genre de gars qui est appelé,Activation object
qui stocke des choses. Par exemple, levar
Par exemple:
L'Objet d'Activation pour
foo
ressemblerait à:ghost
n'est pas stocké dans l'AO! il serait juste accesssible sous ce nom dans la fonction elle-même. Alors quevisible()
est un déclaration de fonction (ou instruction de fonction), il est stocké dans l'AO. C'est parce que, d'une déclaration de fonction est évalué lors de analyse et expression de fonction est évaluée au moment de l'exécution.OriginalL'auteur jAndy
Ce qui se passe ici est que
function()
a de nombreuses significations différentes et les utilise.Quand je dis
alors que c'est 100% équivalent à
c'est à dire le nom n'a pas d'importance lorsque vous utilisez la fonction à attribuer à la variable
bar1
. À l'intérieur,me
est affecté, mais dès que la définition de la fonction est à gauche (lorsque vous affectezbar2
),me
est créé de nouveau comme une variable locale pour la définition de la fonction qui est stocké dansbar2
.bar1
, ce dernier attribue une anonyme fonction debar1
), mais il devrait être à peu près le même, oui. Malheureusement, et c'est important, cependant, l'interpréteur JavaScript avec à peu près la plus grande base installée (JScript dans IE<=8) obtient le premier complètement faux. 🙂OriginalL'auteur Aaron Digulla