Почему funcname() = значение; допустимый синтаксис?

В еще один вопрос, у кого-то было неправильное определение класса, включающее код вроде:

var myClass = function() {
    ...
    this.name() = function() { ... };
}

Очевидная ошибка заключается в том, что метод должен быть определен с помощью this.name = ..., без круглых скобок после name. Когда вы вызываете конструктор, вы получаете ошибку, потому что this.name не определен. Я создал более простой пример в консоли:

foo() = 3;      // Causes: ReferenceError: foo is not defined
function foo() {};
foo() = 3;      // Causes: ReferenceError: Invalid left-hand side in assignment

Есть ли какой-либо контекст, в котором функция могла бы возвращать то, что может быть назначено? Я не думаю, что у Javascript есть ссылки, такие как С++ или PHP, которым можно назначить. Почему это не приводит к синтаксической ошибке, а не к различным ошибкам в зависимости от того, определена ли функция или нет?

Ответы

Ответ 1

Цитата из ECMA Script 5.1 Спецификация для ссылок,

Например, ожидается, что левый операнд присваивания даст ссылку. Поведение присваивания можно было бы объяснить только в терминах анализа случая синтаксической формы левого операнда оператора присваивания, но для одной трудности: вызовам функций разрешено возвращать ссылки. Эта возможность допускается исключительно ради объектов-хозяев. Никакая встроенная функция ECMAScript, определенная этой спецификацией, не возвращает ссылку, и нет никакой возможности для функции, заданной пользователем, для возврата ссылки. (Еще одна причина не использовать синтаксический анализ случая - это то, что он был бы длинным и неудобным, затрагивая многие части спецификации.)


Есть ли какой-либо контекст, в котором функция могла бы возвращать то, что может быть назначено?

Итак, нет. Никакая пользовательская функция не может возвращать ссылку, на которую мы можем назначить значение.

Почему это не вызывает синтаксическую ошибку, а не разные ошибки в зависимости от того, определена ли функция или нет?

Как упоминалось в спецификации, синтаксический анализ был бы длинным, неудобным и затрагивающим многие части спецификации. Таким образом, проверка синтаксиса не выполняется.