JavaScript плюс знак перед выражением функции

868

Я искал информацию о немедленно вызванных функциях, и где-то я наткнулся на эту запись:

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

Может кто-нибудь объяснить мне, что +означает / делает знак перед функцией?

jOpacic
источник
17
Бен Алман объясняет все это здесь: mths.be/iife
Матиас

Ответы:

1321

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

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

Без +него, если синтаксический анализатор находится в состоянии, в котором он ожидает оператор (который может быть выражением или несколькими операторами, не являющимися выражениями), слово functionвыглядит как начало объявления функции, а не как выражение функции и, следовательно, ()следующее за ним (те, что в конце строки выше) будут синтаксической ошибкой (как и отсутствие имени в этом примере). С помощью +, это делает его выражением функции, что означает, что имя является необязательным и которое приводит к ссылке на функцию, которая может быть вызвана, поэтому круглые скобки действительны.

+это только один из вариантов. Она также может быть -, !, ~или просто о каком - либо другом унарном. Кроме того, вы можете использовать круглые скобки (это более распространено, но ни более, ни менее правильно синтаксически):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
TJ Crowder
источник
12
Более подробная информация здесь, benalman.com/news/2010/11/…
Кундан Сингх Чухан,
159
Разве мы не можем сказать, что обертывание пареном является превосходной нотацией? Я ОЧЕНЬ знаком с паренами, которые служат выражению. Совершенно не ясно, что + делает в этом случае, если вы еще не знаете эту загадочную причуду js.
Крис
1
Примечание: из двух вариантов parens jsLint предпочитает второй. Я думаю, что jsHint менее суетливый.
Свекла-Свекла
43
Одна из наиболее часто используемых библиотек, использующая нотацию «плюс», - Bootstrap (именно так я и прочитал эту ветку).
Вилле
Bootstrap делает это, кстати: maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.js
xanderiel
95

Вспомогательный ответ @ TJCrowder, +обычно используется для принудительного числового приведения значения, как объясняется в этом SO-ответе . В данном случае это называется «унарный оператор плюс» (для удобства поиска).

var num = +variant;

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

blah + (+(function(){ var scope; return "4"; })());
Фил Х
источник
3
Как это получило 37 голосов? (+function() { ... })()Обозначения не могут выполняться без ошибок ( за исключением того факта , что это не дает ответа на вопрос).
Уайткварк
6
@whitequark: пропустил пару скобок вокруг функции + вызов. Подозреваю, что против было больше из-за объяснения числа.
Фил Х
10
Хорошо, я мог быть придирчивым.
whitequark
2
@ Кристоф, я бы хотел оставить эти скобки там. На самом деле, я бы зашел так далеко, что добавил бы их, если бы они отсутствовали. Это делает намного более понятным, что происходит, а также предотвращает проблемы, когда код минимизируется путем удаления пробелов, приводящих к тому, 3++function...что это не то же самое.
Бенджам
3
Хотя при дальнейшем размышлении +function...само по себе излишне. Такой же результат может быть достигнут, blah + function( ){ ... }( );что сведет на нет необходимость в оберточных скобках.
Бенджам
61

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

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

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

Конечно, установка скобок вокруг всего этого также служит этой цели.

Джек
источник
45
Пустота или круглые скобки являются чрезвычайно предпочтительными. Они без WTF. Использование + - это ум, который не очень умен.
Питер Воне
2
Хороший вопрос. Похоже, использование одного из операторов пошло бы вразрез с тем, что в настоящее время является отраслевым стандартом. Возможно, «крутые ребята» разработчики выберут это, в противном случае я все еще не вижу смысла использовать что-то, а не void или ()
dudewad