JavaScript plus znak przed wyrażeniem funkcji


Odpowiedzi:


1320

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

12
Bardziej szczegółowe opracowanie znajduje się tutaj, benalman.com/news/2010/11/…
Kundan Singh Chouhan

159
Czy nie możemy powiedzieć, że owijanie paren jest wyższą notacją? Bardzo dobrze znam pareny służące do wyrażania. Nie jest jasne, co + robi w tym przypadku, jeśli jeszcze nie znasz tego tajemniczego dziwactwa js.
Chris

1
Uwaga: Z dwóch opcji parens jsLint woli drugą. Myślę, że jsHint jest mniej wybredny.
Beetroot-Beetroot

43
Jedną z najczęściej używanych bibliotek, które używają notacji „plus”, jest Bootstrap (tak skończyłem czytając ten wątek).
Ville,


94

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

3
Jak to się stało, że uzyskało 37 głosów pozytywnych? (+function() { ... })()Zapis nie może wykonać bez błędów (niezależnie od faktu, że to nie jest odpowiedź na pytanie).
whitequark

6
@whitequark: pominięto parę nawiasów klamrowych wokół funkcji + wywołanie. Podejrzewano, że głosy entuzjastyczne wynikały bardziej z wyjaśnienia dotyczącego rzucania liczb.
Phil H

10
OK, mogłem się nudzić.
whitequark

2
@Christoph Chciałbym zostawić te nawiasy. W rzeczywistości posunąłbym się nawet do dodania ich, gdyby ich nie było. Sprawia, że ​​jest o wiele bardziej jasne, co się dzieje, a także zapobiega problemom, gdy kod jest minimalizowany przez usunięcie spacji, co prowadzi do 3++function...tego, że nie jest to samo.
Benjam,

3
Chociaż po dalszym zastanowieniu +function...sam w sobie nie jest potrzebny. Ten sam wynik można uzyskać, blah + function( ){ ... }( );co neguje potrzebę stosowania wsporników do owijania.
Benjam,

60

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 voidoperatora:

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

Oczywiście, umieszczenie wokół aparatu nawiasów klamrowych również służy temu celowi.


45
Pustki lub nawiasy są niezwykle preferowane. Są wolne od WTF. Używanie + to spryt, który nie jest zbyt mądry.
Peter Wone

2
Dobra uwaga. Wydaje się, że użycie jednego z operatorów działałoby wbrew standardowi branżowemu. Być może twórcy „fajnych dzieciaków” zdecydowaliby się na to, w przeciwnym razie nadal nie widzę sensu używania czegoś zamiast pustki lub ()
dudewad
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.