JavaScript плюс знак перед именем функции
Я искал информацию о функциях, вызывающих себя, и где-то наткнулся на эту запись:
+function(){}
Может кто-нибудь объяснить мне, что +
знак перед функцией означает / делает?
4 ответа
Это заставляет парсер обрабатывать часть, следующую за +
как выражение. Это обычно используется для функций, которые вызываются немедленно, например:
+function() { console.log("Foo!"); }();
Без +
там, если синтаксический анализатор находится в состоянии, где он ожидает оператор (который может быть выражением или несколькими операторами без выражения), слово function
выглядит как начало объявления функции, а не выражения функции, и поэтому ()
после него (те, что в конце строки выше) будет синтаксическая ошибка (как и отсутствие имени в этом примере). С +
, это делает его выражением функции, что означает, что имя является необязательным и которое приводит к ссылке на функцию, которая может быть вызвана, поэтому круглые скобки действительны.
+
это только один из вариантов. Это также может быть -
, !
, ~
или просто о любом другом унарном операторе. Кроме того, вы можете использовать круглые скобки (это более распространено, но ни более, ни менее правильно синтаксически):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
Дочерняя компания к ответу @TJCrowder, +
обычно используется для принудительного числового приведения значения, как объясняется в этом ответе SO. В данном случае это называется "унарный оператор плюс" (для удобства поиска).
var num = +variant;
Таким образом, перед функцией это может быть способ заставить результат функции интерпретироваться как число. Я сомневаюсь, что это еще не произошло, но теоретически JIT мог бы использовать это для компиляции функции как только числовой функции и т. Д. Однако, чтобы не допустить конкатенации унарного плюса при использовании в большем выражении, вам понадобятся скобки:
blah + (+(function(){ var scope; return "4"; })());
Таким образом, короткий ответ заключается в том, что он предотвращает синтаксическую ошибку, так или иначе используя результаты функции.
Вы также можете указать движку, что вас не интересует возвращаемое значение, используя void
оператор:
void function() { console.log("Foo!"); }();
Конечно, установка скобок вокруг всего этого также служит этой цели.
Решение и происхождение
Знак перед функцией, который на самом деле называется унарным плюсом и является частью группы, называемой унарными операторами и (унарный плюс), используется для преобразования строк и других представлений в числа (целые числа или числа с плавающей запятой).
Унарная операция — это операция только с одним операндом, т. е. с одним входом. Это отличается от бинарных операций, которые используют два операнда.
Основное использование:
const x = "1";
const y = "-1";
const n = "7.77";
console.log(+x);
// expected output: 1
console.log(+n);
// expected output: 7.77
console.log(+y);
// expected output: -1
console.log(+'');
// expected output: 0
console.log(+true);
// expected output: 1
console.log(+false);
// expected output: 0
console.log(+'hello');
// expected output: NaN
Когда знак расположен перед переменной, функцией или любым возвращаемым строковым представлением, вывод будет преобразован в целое число или число с плавающей запятой; унарный оператор () также преобразует нестроковые значения
true
,
false
, а также
null
.
Расширенное использование
Правильный способ использования функции, которую вы упомянули выше, будет:
+function(){return "3.141"}()
// expected output: 3.141
я люблю использовать
+
превратить
new Date()
возражать против временной метки , например:
+new Date()
// expected output: 1641387991035
Другие унарные операторы
-
Унарный оператор отрицания преобразует свой операнд в числовой тип, а затем инвертирует его.
~
Побитовый оператор НЕ.
!
Логический оператор НЕ.
delete
Оператор удаления удаляет свойство из объекта.
void
Оператор void отбрасывает возвращаемое выражением значение.
typeof
Оператор typeof определяет тип данного объекта.