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

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

+function(){}

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

3 ответов


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

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

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

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

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

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

var num = +variant;

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

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

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

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

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

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