Почему результат двух определений функций связан запятой?
Почему в следующем предупреждении кода 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:
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Вы можете использовать оператор запятой, если хотите включить несколько выражения в месте, которое требует одного выражения. Большинство общее использование этого оператора заключается в предоставлении нескольких параметров в для цикла.