Запутался с разделом вызовов функций спецификации языка ECMAScript

Я читаю спецификацию языка ECMAScript раздел "Вызовы функций".

Может ли кто-нибудь перефразировать или подробно объяснить мне следующее предложение?

Производство CallExpression : MemberExpression Arguments оценивается следующим образом:

  1. Оцените MemberExpression.

давайте возьмем этот код в качестве примера.

var john = { 
  name: 'John', 
  greet: function(person) { 
    alert("Hi " + person + ", my name is " + this.name); 
  } 
}; 

john.greet("Mark");

Возьмите приведенный выше код в качестве примера. Что означает производственное CallExpression? что такое MemberExpression в данном случае, john.greet?

Спасибо!


person nandin    schedule 29.04.2010    source источник


Ответы (1)


Выражение MemberExpression равно john.greet. В основном это говорит: Шаг 1: Выясните, какую функцию вызывать. :-) Часть john важна, потому что она появляется позже.

Вот полная цитата из самой последней спецификации (ваша ссылка на 3-е издание, которое было заменено 5-е издание; впрочем, это мало что изменило):

  1. Пусть ref будет результатом вычисления MemberExpression.
  2. Пусть func будет GetValue(ref).
  3. Пусть argList будет результатом оценки аргументов, создающим внутренний список значений аргументов (см. 11.2.4).
  4. Если Type(func) не является Object, генерируется исключение TypeError.
  5. Если IsCallable(func) имеет значение false, генерируется исключение TypeError.
  6. Если Type(ref) имеет значение Reference, то
    a. Если IsPropertyReference(ref) имеет значение true,
    i. Пусть thisValue будет GetBase(ref).
    б. В противном случае основой ссылки является запись среды
    i. Пусть thisValue будет результатом вызова конкретного метода ImplicitThisValue GetBase(ref).
  7. В противном случае Type(ref) не является ссылкой.
    а. Пусть это значение не определено.
  8. Возвращает результат вызова внутреннего метода [[Call]] для func, предоставляя thisValue в качестве значения this и предоставляя список argList в качестве значений аргументов.

Как видите, john снова входит в него в 6(a), потому что выражение является ссылкой на свойство, поэтому значение this равно john (а не глобальному объекту, как если бы вы назвали это not через ссылку на свойство).

Если вы читаете спецификацию, я рекомендую прочитать новейшую вместо старого (пока нет HTML-версии). Боюсь, проза не менее напыщенна. :-)

person T.J. Crowder    schedule 29.04.2010
comment
Действительно, попытка прочитать спецификацию ECMA262 вредна для вашего здоровья. Даже для языковых юристов это чудовищно. Хитрость в данном случае заключается в том, что «вычислить» означает не совсем то, что мог бы себе представить обычный программист; результатом является не простое значение, а что-то, что по-прежнему содержит ссылку на MemberExpression john, позволяя магии this работать. - person bobince; 29.04.2010
comment
@bobince: Да. :-) Хорошая новость заключается в том, что, насколько я понимаю, теперь, когда вышла пятая редакция, команда хочет изменить спецификацию этого материала, чтобы сделать его более доступным. На что я говорю: Что, испортить нам все веселье? - person T.J. Crowder; 29.04.2010
comment
Благодарность! это совсем не весело, это как читать юридический документ :( - person nandin; 29.04.2010
comment
@Ding: Да, но без смеха. ;-) - person T.J. Crowder; 30.04.2010