2010-04-29 10 views
1

Je lis ECMAScript Language Specification Function Calls sectionconfondu avec ECMAScript Language Specification Fonction section Appels

Quelqu'un peut-il reformule ou détaillée explique pour moi la sentense suivante?

Le CallExpression de production: MemberExpression Arguments évalués comme suit:

  1. Évaluer MemberExpression. Prenons ce code comme un exemple.

Prenez le code ci-dessus à titre d'exemple, que signifie CallExpression de production? Qu'est-ce que MemberExpression dans ce cas, john.greet?

Merci!

Répondre

2

La MemberExpression est john.greet. Fondamentalement ce qu'il dit est: Étape 1: Déterminez quelle fonction appeler. :-) La partie john est importante, car elle intervient plus tard.

est ici la citation complète de la spécification la plus récente (votre lien est à la 3ème édition, qui a été remplacée par le 5th edition, ce qui n'a pas beaucoup changé si):

  1. Laissez-ref être le résultat de l'évaluation de MemberExpression.
  2. Soit func GetValue (ref). Soit argList le résultat de l'évaluation des arguments, produisant une liste interne de valeurs d'arguments (voir 11.2.4).
  3. Si Type (func) n'est pas Object, lance une exception TypeError.
  4. Si IsCallable (func) est défini sur false, lancez une exception TypeError. Si le Type (ref) est Référence, alors
    Si IsPropertyReference (ref) est vrai, alors
            i. Laissez thisValue être GetBase (ref).
        b. Sinon, la base de ref est un enregistrement d'environnement
            i. Laissez thisValue être le résultat de l'appel de la méthode concrète ImplicitThisValue de GetBase (ref).
  5. Sinon, le type (ref) n'est pas Référence.
        a. Laissez thisValue être indéfini.
  6. Renvoie le résultat de l'appel de la méthode interne [[Call]] sur func, en fournissant thisValue comme valeur this et en fournissant la liste argList comme valeurs d'argument.

Comme vous pouvez le voir, john entre en nouveau à 6 (a) parce que l'expression est une référence de la propriété, de sorte que la valeur this est john (plutôt que l'objet global, car il serait si vous appelé pas via une référence de propriété).

Si vous lisez les spécifications, je recommande de lire le newest one au lieu de l'ancien (pas encore de version HTML). J'ai bien peur que la prose ne soit pas moins turgide. :-)

+1

En effet, essayer de lire réellement la spécification ECMA262 n'est pas bon pour votre santé. Même pour les avocats en langues, c'est un truc bestial. L'astuce dans ce cas est que "évaluer" ne signifie pas entièrement ce qu'un programmeur normal pourrait imaginer; le résultat n'est pas une simple valeur mais quelque chose qui contient toujours une référence à MemberExpression 'john', permettant à la magie' this' de fonctionner. – bobince

+0

@bobince: Oui. :-) La bonne nouvelle est que, si je comprends bien, maintenant que la 5ème édition est terminée, l'équipe veut changer la façon dont ils specifient ces choses pour être plus accessible. A quoi je dis: Quoi, et ruiner tout notre plaisir? –

+0

merci! ce n'est pas amusant du tout, c'est comme lire un document légal :( – nandin