9
votes

Scoping local JavaScript: Var vs. Ceci

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: xxx

maintenant, je comprends qu'une référence à A fonctionne directement. Je comprends aussi que les messages 3 et 4 ( ceci.a et this.b ) échouera car ceci 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.

Ce que je ne comprends pas est:

  • Pourquoi les messages 1 et 2 ne travaillent-ils pas?
  • Pourquoi les messages 5 et 6 travaillent-ils?

8 commentaires

Pourquoi travailleraient-ils sembla? On dirait que vous analoguez avec Java ou une autre langue où l'espace de noms 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; ) avec des objets qui ne sont pas des variables mais des propriétés d'objets ( this.b = 10; définit la propriété B de l'objet que ceci se réfère à 10 ). 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); ou this.method = innerMethod; et (nouveau myObject ()). Méthode ( );


@Pauls. Changer le Cette référence 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


3 Réponses :


1
votes

C'est un problème de portée, lorsque des fonctions sont créées, ils enregistrent leur environnement (y compris les variables).

Alors, lorsque innerMethod est créé, il peut voir les variables auto et a .

Un concept important est que la portée est créée lorsque la fonction est déclarée, au lieu de celle-ci.

Dans votre cas 1, B n'est pas déclaré (le présent objet n'est pas identique).

Dans les cas 5 et 6, vous n'avez pas créé self.a .


0 commentaires

4
votes

La variable A est juste que, une variable. Il est visible dans la portée de innerMethod (qui est juste une fonction imbriquée), comme a , 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).

Ce n'est pas identique à la portée locale du constructeur myObject .

Vous avez vu que auto est un alias pour ceci de myObject , et que innerMETHOD a écrasé ceci dans sa propre portée. Néanmoins, depuis ceci n'est pas un alias pour la portée de la fonction, ni self.a ni ceci.a fonctionnera ici.

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>

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


2 commentaires

Je préférerais le terme variableVironment au lieu de Fonction Portée 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.



0
votes

La raison principale est que auto n'est pas égal à Ceci dans la portée de InnerMethod . Ce est un mot-clé pour référencer le propriétaire de la fonction. Pour INNERMEMETHOD , ce n'est pas une méthode d'instance, elle appartient à la fenêtre. XXX

Vous pouvez jouer à ici


0 commentaires