Почему результат двух определений функций связан запятой?

Почему в следующем предупреждении кода 2?

var f = (function x(){ return 1; }, function y(){ return 2; })();
alert(f);

Что я вижу, так это то, что функция y выполняется, а функция x игнорируется. (Я убедился, что я положил alert в обе функции, и вызывается только alert in y, из-за чего я считаю, что функция x вообще не вызывается)

И если я удалю функцию y, то она оповещает 1.

Что происходит?

Ответ 1

Хорошо, пусть немного сломается.

(function x(){ return 1; }, function y(){ return 2; })

Это два функциональных литерала. Далее используется оператор запятой. Он оценивает выражения (обе функции) и возвращает последний. результатом этого выражения является: function y(){ return 2; }

Это означает, что оставшееся выражение: var f = (function y(){ return 2; })();

Следующее, что мы делаем, это вызвать его (с помощью ()), который возвращает 2 в переменную f;

Ответ 2

Когда вы используете оператор запятой, возвращаемое значение - это значение последнего элемента, в вашем случае, функция y() (которая возвращает 2)

Из документов mozilla:

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

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