Znak JavaScript plus przed nazwą funkcji

Szukałem informacji o funkcjach samouwolucyjnych i gdzieś natknąłem się na ten zapis:

+function(){}

Może mi ktoś wyjaśnić co oznacza / robi znak + przed funkcją?

Author: chŝdk, 2012-11-12

3 answers

Wymusza traktowanie części następującej po + jako wyrażenia. Jest to zwykle używane do funkcji, które są wywoływane natychmiast, np.:

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

BEZ + tam, jeśli parser znajduje się w stanie, w którym oczekuje instrukcji (która może być wyrażeniem lub kilkoma wypowiedziami nie wyrażonymi), słowo functionwygląda jak początek deklaracji funkcji zamiast wyrażenia funkcji i tak () po nim (te w koniec linii powyżej) byłby błędem składni (podobnie jak brak nazwy w tym przykładzie). z +, sprawia, że jest to wyrażenie funkcji, co oznacza, że nazwa jest opcjonalna i co skutkuje odniesieniem do funkcji, którą można wywołać, więc nawiasy są ważne.

+ to tylko jedna z opcji. Może być również-, !, ~, lub prawie każdy inny operator jednoetapowy. Alternatywnie można użyć nawiasów (jest to bardziej powszechne, ale ani mniej lub bardziej poprawna składniowo):

(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
 1243
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-28 06:32:06

W odpowiedzi @TJCrowder, {[2] } jest zwykle używany do wymuszania numerycznego odlewania wartości , ponieważ ta odpowiedź wyjaśnia . W tym przypadku nazywany jest "operatorem uniary plus" (dla ułatwienia googlowania).

var num = +variant;

Więc przed funkcją można wymusić interpretację wyniku funkcji jako liczby. Wątpię, że to się jeszcze dzieje, ale teoretycznie JIT mógłby użyć tego do skompilowania funkcji jako funkcji tylko numerycznej itp. Jednak, aby zapobiec uniary dodatkowo będąc konkatenacją w przypadku użycia w większym wyrażeniu, potrzebujesz nawiasów:

blah + (+(function(){ var scope; return "4"; })());
 85
Author: Phil H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:22

Więc krótka odpowiedź jest taka, że zapobiega to błędowi składni, używając wyników funkcji w taki czy inny sposób.

Możesz również poinstruować silnik, że nie jesteś nawet zainteresowany wartością zwracaną, używając operatora void:

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

Oczywiście, zakładanie szelek wokół całej sprawy również służy temu celowi.

 49
Author: Ja͢ck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-16 16:45:29