Перепутанный с разделом ECMAScript Language Specification Function Calls

Я читаю раздел ECMAScript Language Specification Function Calls

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

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

  1. Оцените MemberExpression.

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

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

john.greet("Mark");

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

Спасибо!

1
задан Shog9 17 August 2010 в 23:35
поделиться

1 ответ

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

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

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

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

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

.
2
ответ дан 3 September 2019 в 00:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: