Почему этот JavaScript работает?
1151 просмотра
4 ответа
Я смотрел на вывод некоторых вещей из UglifyJS и наткнулся на некоторый код, подобный следующему:
var a = 0;
var b = function () {
return function () {
a++;
}(), 'Hello, World'
}();
После запуска этот код a
является 1
и b
является строкой Hello, World!
.
На первый взгляд кажется, что это b
произойдет, undefined
поскольку похоже, что возвращается функция без возвращаемого значения, но за ней следуют запятая и строковый литерал.
Почему это работает?
И почему UglifyJS просто не выполняет анонимную функцию, а затем возвращается Hello, World!
в качестве следующего оператора?
Ответы (4)
25 плюса
Работает за счет оператора запятой. Из спецификации MDN:
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Обе функции являются IFFY, они выполняются немедленно.
Автор: Wouter J Размещён: 26.10.2012 04:076 плюса
Результатом выражения с использованием оператора запятой является правая часть оператора запятой.
У вас есть:
return a_function_call(), a_string
... так что вы получили a_string
назначение.
4 плюса
Прежде всего позвольте мне привести MDN на оператор запятой :
Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Из сказанного ясно, как ваш код оценивает:
Внутри сразу выполняемой функции вы возвращаете 2 значения, разделенные запятой:
function () { a++; }()
а также
'Hello World'
Таким образом, оба операнда оцениваются. Это увеличивает вашу переменную a
и приводит к следующему выражению для возвращаемого значения создаваемой функции b
:
undefined, 'Hello World'
Наконец, правый операнд возвращается как значение для внешней функции, таким образом давая b
значение 'Hello World'
.
0 плюса
Проверьте оператор запятой в JavaScript .
Автор: Jarrett Meyer Размещён: 26.10.2012 04:10Оператор запятой оценивает оба своих операнда (слева направо) и возвращает значение второго операнда.
Вопросы из категории :
- javascript Как определить, какой из указанных шрифтов был использован на веб-странице?
- javascript Валидация клиентской стороны ASP.Net
- javascript Длина объекта JavaScript
- javascript Получение текста из выпадающего списка
- javascript Скрипт входа со скрытыми кнопками
- javascript Как автоматически изменить размер текстовой области с помощью Prototype?
- javascript Удаление элементов с помощью Array.map в JavaScript
- javascript Прокрутка переполненных DIV с помощью JavaScript
- javascript API Карт Google - проблемы с классом GLatLngBounds
- javascript Проверка десятичных чисел в JavaScript - IsNumeric ()
- uglifyjs Имеет ли смысл минимизировать код, используемый в NodeJS?
- uglifyjs Почему этот JavaScript работает?
- uglifyjs Angular.module minification bug
- uglifyjs UglifyJS наблюдатель файлов в IntelliJ минимизирует уже минимизированные файлы во время сборки
- uglifyjs Условные возвраты или возврат одной переменной
- uglifyjs Минимизация внутренних машинописных модулей с помощью webpack / uglifyJS
- uglifyjs Как отследить ошибку Uglify с Ember CLI
- uglifyjs SbtWeb: усилить вывод traceur
- uglifyjs Play Framework: минимизация / скрытие исходных файлов Javascript
- uglifyjs Uglify / минимизировать веб-компоненты Polymer, используя gulp