Ответ 1
Это сложная задача и сводится к внутренней работе стандарта ECMAScript. Определение оператора группировки:
Производственное первичное выражение: (выражение) оценивается следующим образом:
- Возвращает результат вычисления выражения. Это может быть тип Reference.
С добавленным примечанием:
Этот алгоритм не применяет
GetValue
к результату оценки выражения. Главной мотивацией для этого является то, что операторы, такие какdelete
иtypeof
, могут применяться к заключенным в скобки выражениям.
Итак, это ключ: результат может иметь тип Ссылка. Ссылка - это внутренний тип данных, который состоит из базового значения и ссылочного имени.
Например, оценивая выражение-член foo.bar
, получается ссылка с базовым значением foo
(объект) и ссылочное имя "bar"
(просто строковое представление идентификатора).
GetValue(ref)
- это внутренняя функция, которая фактически обращается к свойству объекта и возвращает значение свойства (объект функции в этом Примеры). Большинство операторов, вызывающих GetValue
в своих операндах, разрешают эти ссылки, но не оператор группировки.
Посмотрите, как Вызовы CallExpressions могут также дать представление о том, как работают this
и ссылки. Например, один шаг:
Пусть thisValue является результатом вызова конкретного метода ImplicitThisValue GetBase (ref).
Итак, если у вас есть значение Reference и попытайтесь вызвать его, значение this
будет установлено на базовое значение Reference (foo
в приведенном выше примере).
Что касается моего примера (true && foo.bar)();
: Оператор &&
вызывает GetValue()
для обоих своих операндов, поэтому результат группировки оператор не является ссылкой.