Подтвердить что ты не робот

Поведение запятых в круглых скобках в Javascript

У меня есть двоякий вопрос, который включает в себя что-то, что я считаю неправильным Javascript-кодом.

Как следующий оператор интерпретируется в Javascript и почему?

(1,2,3,4)

Почему существует разница между этими двумя вызовами:

var a = (1,2,3,4);
a();

что приводит к тому, что a равен 4 и Uncaught TypeError: a is not a function, и

(1,2,3,4)();

что приводит к Uncaught TypeError: (((1 , 2) , 3) , 4) is not a function?

4b9b3361

Ответ 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) не является функцией?

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

Ответ 2

В JS (среди других языков) есть оператор, называемый оператором запятой. Он просто принимает два операнда и возвращает самый правый.

a = 1, 2; // a now equals 2

Это, однако, не та же запятая, что и разделитель параметров функции. Это оператор.

Ответ 3

Оператор запятой оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

Итак, оператор (1,2,3,4); возвращает 4, поэтому var a = (1,2,3,4); означает, что a равно 4, который не является функцией, поэтому ошибка.

Аналогично, (1,2,3,4) - это просто группировка операторов запятой, а не функция, поэтому вторая ошибка.