Ответ 1
Как следующий оператор интерпретируется в Javascript и почему?
(1,2,3,4)
Это выражение оператора запятой (фактически, цепочка из них), заключенное в круглые скобки. Оператор запятой довольно необычен: он вычисляет оба операнда, а затем берет значение второго в качестве значения, отбрасывая значение первого. У вас есть целая цепочка из них, поэтому оценивается значение 1, затем 2, затем 3, затем 4, а результатом цепочки операторов запятой является значение 4; результат выражения сгруппированных скобок, следовательно, 4.
Почему существует разница между этими двумя вызовами:
var a = (1,2,3,4); a();
Из-за синтаксиса языка. В первом случае это явно не вызов функции, так как перед первым вызовом (
нет значения. Правила синтаксического анализа сложного языка, такого как JavaScript, - это просто: Complex. Анализатор чувствителен к контексту и знает, как различать группирующие круглые скобки и круглые скобки функций.
что приводит к тому, что оно равно 4 и невозвращает TypeError: a не является функцией, которая бросается, и
(1,2,3,4)();
что приводит к Uncaught TypeError: (((1, 2), 3), 4) не является функцией?
В обоих случаях сообщение об ошибке цитирует выражение, которое дало результат, который затем попытался вызвать как функцию.