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

Почему этот JavaScript работает?

Я смотрел вывод некоторых вещей из UglifyJS и происходил через какой-то код вроде:

var a = 0;
var b = function () {
    return function () {
        a++;
    }(), 'Hello, World'
}();

После запуска этого кода a есть 1 и b - строка Hello, World!.

На первый взгляд кажется, что b будет undefined, поскольку он выглядит как результат функции без возвращаемого значения, но за этим следует запятая и строковый литерал.

Почему это работает?
И почему UglifyJS просто выполняет анонимную функцию, а затем возвращает Hello, World! в качестве следующего утверждения?

4b9b3361

Ответ 1

Он работает из-за оператора запятой. Из спецификаций MDN:

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

Обе функции являются IFFY, они выполняются немедленно.

Ответ 2

Результатом выражения с использованием оператора запятой является правая часть оператора запятой.

У вас есть:

return a_function_call(), a_string

... поэтому вы назначаете a_string.

Ответ 3

Прежде всего позвольте мне привести MDN в операторе запятой:

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

С учетом сказанного ясно, как оценивается ваш код:

Внутри немедленно выполняемой функции вы возвращаете 2 значения, разделенные запятой:

function () { a++; }()

и

'Hello World'

Итак, оба операнда оцениваются. Это увеличивает вашу переменную a и приводит к следующему выражению для возвращаемого значения функции для создания b:

undefined, 'Hello World'

Наконец, правый операнд возвращается как значение для внешней функции, тем самым давая b значение 'Hello World'.

Ответ 4

Обратите внимание на запятую в JavaScript.

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