JavaScript плюс знак перед виразом функції


866

Я шукав інформацію про негайно викликані функції, і десь натрапив на це позначення:

+function(){console.log("Something.")}()

Чи може хтось пояснити мені, що +означає / робить знак перед функцією?


17
Бен Альман пояснює все це тут: mths.be/iife
Mathias Bynens

Відповіді:


1320

Це змушує парсера ставитися до частини, що слідує за +виразом,. Зазвичай це використовується для функцій, які викликаються негайно, наприклад:

+function() { console.log("Foo!"); }();

Без того +, якщо аналізатор перебуває у стані, коли він очікує твердження (яке може бути виразом або декількома неекспресіями), слово functionвиглядає як початок оголошення функції, а не вираз функції, і тому ()наступне його (ті в кінці рядка вище) буде синтаксичною помилкою (як і відсутність імені в цьому прикладі). З допомогою +, це робить його виразом функції, що означає, що ім'я є необов'язковим, і це призводить до посилання на функцію, яку можна викликати, тому дужки є дійсними.

+це лише один із варіантів. Вона також може бути -, !, ~або просто про яке - або іншому унарна. Крім того, ви можете використовувати дужки (це є більш поширеним, але ні більш, ні менш синтаксичним):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());

12
Більш детальна інформація тут, benalman.com/news/2010/11/…
Kundan Singh Chouhan

159
Чи не можемо ми сказати, що обговорення батьків - це вища ознака? Я ДУЖЕ знайомий з паронами, які служать для охоплення виразів. Зовсім не ясно, що + робить у цьому випадку, якщо ви ще не знаєте цієї прихованої химерності js.
Кріс

1
Примітка. З двох варіантів паронів jsLint віддає перевагу другому. Я думаю, що jsHint менш метушливий.
Буряк-Буряк

43
Однією з часто використовуваних бібліотек, яка використовує позначення "плюс", є Bootstrap (саме так я закінчив читати цю тему).
Віль


94

Дочірня відповідь на відповідь @ TJCrowder, +як правило, використовується для примусового числення значення, як пояснюється в цій відповіді . У цьому випадку його називають "оператором плюс унар плюс" (для зручності гуглінгу).

var num = +variant;

Тож перед функцією це може бути спосіб змусити результат функції інтерпретувати як число. Я сумніваюся, що це все ще трапляється, але теоретично JIT міг би використовувати це для компіляції функції як функція, що є лише числом і т. Д. Однак, щоб уніар плюс не був конкатенацією при використанні в більшому виразі, вам знадобляться дужки:

blah + (+(function(){ var scope; return "4"; })());

3
Як це коли-небудь отримало 37 результатів? (+function() { ... })()Позначення не можуть виконуватися без помилок ( за винятком того факту , що це не дає відповіді на питання).
whitequark

6
@whitequark: пропущена пара дужок навколо функції + виклик. Підозрюють, що виплат було більше через пояснення кількості викидів.
Філ Х

10
Гаразд, я міг би заїдати.
whitequark

2
@Christoph Я був би схильний залишити ці дужки там. Насправді я б пішов так далеко, щоб додати їх, якби вони відсутні. Це робить його набагато зрозумілішим, що відбувається, а також запобігає виникненню проблем, коли код зводиться до мінімуму шляхом видалення пробілів, що призводить до того, 3++function...що це не те саме.
Бенджам

3
Хоча щодо подальшої рефлексії, +function...саме по собі це зайве. Такий же результат може бути, і blah + function( ){ ... }( );це призведе до заперечення потреби в обгорткових дужках.
Бенджам

60

Отже, коротка відповідь полягає в тому, що вона запобігає синтаксичній помилці, використовуючи функцію результатів так чи інакше.

Ви також можете доручити двигуну, що вас навіть не цікавить повернене значення, скориставшись voidоператором:

void function() { console.log("Foo!"); }();

Звичайно, поставлення брекетів навколо всієї речі також служить цій цілі.


45
Порожнеча чи круглі дужки надзвичайно переважні. Вони не мають WTF. Використання + - це кмітливість, яка не дуже розумна.
Пітер Вун

2
Хороший момент. Схоже, використання одного з операторів буде протидіяти тому, що зараз є галузевим стандартом. Можливо, розробники "крутого малюка" обрали б це, інакше я все ще не бачу сенсу використовувати щось, а не пустоту або ()
dudewad
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.