2013-04-04 2 views
10

Зачем нужен предупреждающий код 2?Почему результат двух определений функций, соединенных запятой?

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

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

И если я удалю функцию y затем он предупреждает 1.

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

ответ

14

Хорошо, давайте сломаем его немного.

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

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

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

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

+0

Спасибо, я не знаю, как принять 2 ответа, должен быть такой вариант. поэтому я буду поддерживать вас. –

+0

Ну, другой ответ тоже хорош. Честно говоря, мой ответ был первым на несколько минут, он ссылается на тот же самый ресурс, но объясняет это, а не цитирует его, и я думаю, что дает более подробное объяснение этой проблеме, это только мое мнение. –

+0

Прошу прощения, я принял другой ответ из-за только одной причины, и это на моем экране. Я вижу, что принятый ответ на 2 минуты раньше вашего. Поэтому я не уверен, что делать, я смущен :( –

5

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

из MOZILLA документы:

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

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

Смежные вопросы