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

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

+function(){}

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

Ответ 1

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

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

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

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

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

Ответ 2

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

var num = +variant;

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

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

Ответ 3

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

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

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

Разумеется, использование этой фигуры также служит этой цели.