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

javascript uglifyjs

1151 просмотра

4 ответа

6363 Репутация автора

Я смотрел на вывод некоторых вещей из UglifyJS и наткнулся на некоторый код, подобный следующему:

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

После запуска этот код aявляется 1и bявляется строкой Hello, World!.

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

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

Автор: knpwrs Источник Размещён: 26.10.2012 04:03

Ответы (4)


25 плюса

37058 Репутация автора

Решение

Работает за счет оператора запятой. Из спецификации MDN:

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

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

Автор: Wouter J Размещён: 26.10.2012 04:07

6 плюса

696125 Репутация автора

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

У вас есть:

return a_function_call(), a_string

... так что вы получили a_stringназначение.

Автор: Quentin Размещён: 26.10.2012 04:08

4 плюса

57724 Репутация автора

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

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

Из сказанного ясно, как ваш код оценивает:

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

function () { a++; }()

а также

'Hello World'

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

undefined, 'Hello World'

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

Автор: Sirko Размещён: 26.10.2012 04:09

0 плюса

17582 Репутация автора

Проверьте оператор запятой в JavaScript .

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

Автор: Jarrett Meyer Размещён: 26.10.2012 04:10
Вопросы из категории :
32x32