Je ne peux pas sembler avoir la tête autour d'un cas spécifique de scoper pour les variables JavaScript. Différents d'autres exemples et questions que j'ai trouvés, je suis intéressé par la portée des fonctions imbriquées.
J'ai mis en place un exemple sur Ce jsfiddle . La partie pertinente est la suivante: p> maintenant, je comprends qu'une référence à Ce que je ne comprends pas est: p> A code> fonctionne directement.
Je comprends aussi que les messages 3 et 4 (
ceci.a code> et
this.b code>) échouera car
ceci code> fait référence à la fonction interne. Je comprends aussi que la ligne 6 fonctionne parce que je sauvegardez la référence à l'objet d'origine. P>
3 Réponses :
C'est un problème de portée, lorsque des fonctions sont créées, ils enregistrent leur environnement (y compris les variables). P>
Alors, lorsque Un concept important est que la portée est créée lorsque la fonction est déclarée, au lieu de celle-ci. P>
Dans votre cas 1, Dans les cas 5 et 6, vous n'avez pas créé innerMethod code> est créé, il peut voir les variables
auto code> et
a code>. p>
B code> n'est pas déclaré (le présent objet n'est pas identique). P>
self.a code>. p>
La variable Vous avez vu que Pour une explication plus rigoureuse de la portée lexicale que vous pouvez par exemple. Commencez à Wikipedia: http://en.wikipedia.org/wiki/scope_(Computer_science )<< a> p>
Vous pouvez lire sur les règles de résolution de contextes d'exécution et de résolution d'identifiant dans la norme ECMA http: // es5. github.com/#x10.3 p> A code> est juste que, une variable. Il est visible dans la portée de
innerMethod code> (qui est juste une fonction imbriquée), comme
a code>, ce qui a été déclaré (c.-à-d. JavaScript comportant des règles de scopage lexicales, des fonctions internes peut voir des variables des fonctions qu'ils sont définies à l'intérieur de). p>
Ce code> n'est pas identique à la portée locale du constructeur code> myObject code>. p>
auto code> est un alias pour
ceci code> de
myObject code>, et que
innerMETHOD code> a écrasé
ceci code> dans sa propre portée. Néanmoins, depuis
ceci code> n'est pas un alias pour la portée de la fonction, ni
self.a code> ni
ceci.a code> fonctionnera ici. P>
Je préférerais le terme variableVironment code>
au lieu de Fonction Portée Code> Dans votre 3ème paragraphe, et indiquez que la raison du premier paragraphe est que JS a Portée lexicale . Mais très bien expliqué.
J'ai incorporé certaines de vos modifications, mais je suis hésitant à échanger variableVironMentimation pour la portée de la fonction. Même si c'est techniquement plus correct, je pense que la portée de la fonction est un concept mieux connu pour les programmeurs provenant d'autres langues. J'ai ajouté votre lien vers la norme ECMA.
La raison principale est que Vous pouvez jouer à auto code> n'est pas égal à
Ceci code> dans la portée de InnerMethod strong>.
Ce code> est un mot-clé pour référencer le propriétaire de la fonction. Pour
Pourquoi travailleraient-ils sembla? On dirait que vous analoguez avec Java ou une autre langue où l'espace de noms code> est implicite, ce qui n'est pas le cas pour JS.
@ Fabríciomatté Je pourrais être inconscient de faire cela (jeu de mots). Je ne comprends pas si le scopage doit rendre les variables / membres exposés automatiquement à des membres internes. Il semble que ce ne soit pas le cas, car ce n'est pas cohérent.
@Alpha, vous comparez des variables (
var a = 5; code>) avec des objets qui ne sont pas des variables mais des propriétés d'objets (
this.b = 10; code> définit la propriété
B code> de l'objet que
ceci code> se réfère à
10 code>). Ces choses ne sont pas les mêmes et ne se comportent donc pas de manière identique.
Je pense à un moyen simple de l'expliquer, mais la portée lexicale de JS n'expose-t-elle pas automatiquement les membres aux membres internes comme vous l'avez dit.
@Niko merci! Je pense que c'était le noyau même de ma confusion.
@Alpha Voir comment 4 changements si vous avez fait
innerMethod.call (this); code> ou
this.method = innerMethod; code> et
(nouveau myObject ()). Méthode ( ); code>
@Pauls. Changer le
Cette référence CODE> est un peu hors de la question de la question que je crois, mais voici un bon article si OP ou quiconque veut lire: méthodes mythiques par TJ Crowder .
Voir aussi Stackoverflow.com/q/13418669/1048572