MemberExpression - john.greet
. В основном это говорит: Шаг 1: выяснить, какую функцию вызывать. :-) Часть john
важна, потому что она появится позже.
Вот полная цитата из самой последней спецификации (ваша ссылка на 3-е издание, которое было заменено на 5-е издание ; хотя это не сильно изменилось):
- Пусть ref будет результатом вычисления MemberExpression.
- Пусть func будет GetValue (ref).
- Пусть argList будет результатом вычисления Аргументов и создания внутреннего списка значений аргументов (см. 11.2.4).
- Если Type (func) не является Object, генерировать исключение TypeError.
- Если IsCallable (func) имеет значение false, генерировать исключение TypeError.
- Если тип (ссылка) является ссылкой, то
а. Если IsPropertyReference (ref) имеет значение true, то
я. Пусть thisValue будет GetBase (ref).
б. Иначе, база ref - Экологический Рекорд
я. Пусть thisValue будет результатом вызова конкретного метода ImplicitThisValue метода GetBase (ref).
- Иначе, Тип (ссылка) не является Ссылкой.
а. Пусть thisValue не определено.
- Возвращает результат вызова внутреннего метода [[Call]] для func, предоставляя thisValue в качестве значения this и предоставляя список argList в качестве значений аргумента.
Как видите, john
входит в него снова в 6 (a), потому что выражение является ссылкой на свойство, поэтому значение this
равно john
(а не глобальному объекту, как это было бы, если бы Вы назвали это , а не через ссылку на свойство).
Если вы читаете спецификацию, я рекомендую прочитать самую новую вместо старой (пока нет версии HTML). Боюсь, что проза не менее упругая. : -)