Путать с разделом вызовов функций спецификации языка ECMAScript - PullRequest
1 голос
/ 29 апреля 2010

Я читаю Спецификацию языка ECMAScript Раздел вызовов функций

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

Производство CallExpression: Аргументы MemberExpression - это оценивается следующим образом:

  1. Оценить выражение члена.

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

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

john.greet("Mark");

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

Спасибо!

1 Ответ

2 голосов
/ 29 апреля 2010

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. Если тип (ссылка) является ссылкой, то
    а. Если IsPropertyReference (ref) имеет значение true, то
    я. Пусть thisValue будет GetBase (ref).
    б. Иначе, база ref - Экологический Рекорд
    я. Пусть thisValue будет результатом вызова конкретного метода ImplicitThisValue метода GetBase (ref).
  7. Иначе, Тип (ссылка) не является Ссылкой.
    а. Пусть thisValue не определено.
  8. Возвращает результат вызова внутреннего метода [[Call]] для func, предоставляя thisValue в качестве значения this и предоставляя список argList в качестве значений аргумента.

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

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

...