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


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

+function(){}

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

3 787

3 ответа:

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

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

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

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

(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!"); }();

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