Szukałem informacji o natychmiastowo wywoływanych funkcjach i gdzieś natknąłem się na tę notację:
+function(){console.log("Something.")}()
Czy ktoś może mi wyjaśnić, co +
oznacza / robi znak przed funkcją?
Szukałem informacji o natychmiastowo wywoływanych funkcjach i gdzieś natknąłem się na tę notację:
+function(){console.log("Something.")}()
Czy ktoś może mi wyjaśnić, co +
oznacza / robi znak przed funkcją?
Odpowiedzi:
Zmusza parser do traktowania części następującej po +
wyrażeniu. Jest to zwykle używane w przypadku funkcji wywoływanych natychmiast, np .:
+function() { console.log("Foo!"); }();
Bez tego +
, jeśli analizator składni znajduje się w stanie, w którym oczekuje instrukcji (która może być wyrażeniem lub kilkoma wyrażeniami niebędącymi wyrażeniami), słowo to function
wygląda raczej na początek deklaracji funkcji niż na wyrażenie funkcji, a więc ()
następujące po nim (te na końcu powyższej linii) byłby błędem składni (podobnie jak brak nazwy w tym przykładzie). W przypadku +
, sprawia, że jest to wyrażenie funkcyjne, co oznacza, że nazwa jest opcjonalna i co prowadzi do odwołania do funkcji, którą można wywołać, więc nawiasy są poprawne.
+
jest tylko jedną z opcji. Może to być również -
, !
, ~
, lub po prostu o każdy inny podmiot jednoargumentowego. Alternatywnie możesz użyć nawiasów (jest to bardziej powszechne, ale ani bardziej ani mniej poprawne składniowo):
(function() { console.log("Foo!"); })();
// or
(function() { console.log("Foo!"); }());
Podporządkowana odpowiedzi @ TJCrowder, +
jest zwykle używana do wymuszenia rzutowania numerycznego wartości, jak wyjaśnia ta odpowiedź SO . W tym przypadku nazywa się go „operatorem jednoargumentowym plus” (dla ułatwienia przeglądania google).
var num = +variant;
Zatem przed funkcją może być sposób na wymuszenie interpretacji wyniku funkcji jako liczby. Wątpię, by to się jeszcze zdarzyło, ale teoretycznie JIT mógłby użyć tego do skompilowania funkcji jako funkcji wyłącznie numerycznej itp. Jednak aby uniknąć sytuacji, w której jednoargumentowy plus byłby konkatenacją, gdy byłby używany w większym wyrażeniu, potrzebne byłyby nawiasy:
blah + (+(function(){ var scope; return "4"; })());
(+function() { ... })()
Zapis nie może wykonać bez błędów (niezależnie od faktu, że to nie jest odpowiedź na pytanie).
3++function...
tego, że nie jest to samo.
+function...
sam w sobie nie jest potrzebny. Ten sam wynik można uzyskać, blah + function( ){ ... }( );
co neguje potrzebę stosowania wsporników do owijania.
Krótka odpowiedź brzmi więc, że zapobiega błędowi składniowemu, używając wyników funkcji w taki czy inny sposób.
Możesz również poinstruować silnik, że nawet nie jesteś zainteresowany wartością zwracaną, używając void
operatora:
void function() { console.log("Foo!"); }();
Oczywiście, umieszczenie wokół aparatu nawiasów klamrowych również służy temu celowi.