Ответ 1
Он работает из-за оператора запятой. Из спецификаций MDN:
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Обе функции являются IFFY, они выполняются немедленно.
Я смотрел вывод некоторых вещей из UglifyJS и происходил через какой-то код вроде:
var a = 0;
var b = function () {
return function () {
a++;
}(), 'Hello, World'
}();
После запуска этого кода a
есть 1
и b
- строка Hello, World!
.
На первый взгляд кажется, что b
будет undefined
, поскольку он выглядит как результат функции без возвращаемого значения, но за этим следует запятая и строковый литерал.
Почему это работает?
И почему UglifyJS просто выполняет анонимную функцию, а затем возвращает Hello, World!
в качестве следующего утверждения?
Он работает из-за оператора запятой. Из спецификаций MDN:
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Обе функции являются IFFY, они выполняются немедленно.
Результатом выражения с использованием оператора запятой является правая часть оператора запятой.
У вас есть:
return a_function_call(), a_string
... поэтому вы назначаете a_string
.
Прежде всего позвольте мне привести MDN в операторе запятой:
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
С учетом сказанного ясно, как оценивается ваш код:
Внутри немедленно выполняемой функции вы возвращаете 2 значения, разделенные запятой:
function () { a++; }()
и
'Hello World'
Итак, оба операнда оцениваются. Это увеличивает вашу переменную a
и приводит к следующему выражению для возвращаемого значения функции для создания b
:
undefined, 'Hello World'
Наконец, правый операнд возвращается как значение для внешней функции, тем самым давая b
значение 'Hello World'
.
Обратите внимание на запятую в JavaScript.
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.