JavaScript plus firma davanti all'espressione della funzione


868

Ho cercato informazioni sulle funzioni immediatamente invocate e da qualche parte mi sono imbattuto in questa notazione:

+function(){console.log("Something.")}()

Qualcuno può spiegarmi cosa +significa / fa il segno davanti alla funzione?


17
Ben Alman spiega tutto qui: mths.be/iife
Mathias Bynens,

Risposte:


1321

Forza il parser a trattare la parte che segue +come un'espressione. Di solito viene utilizzato per le funzioni che vengono invocate immediatamente, ad esempio:

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

Senza il +lì, se il parser si trova in uno stato in cui si aspetta un'istruzione (che può essere un'espressione o più istruzioni di non espressione), la parola functionsembra l'inizio di una dichiarazione di funzione piuttosto che un'espressione di funzione e quindi la ()seguente (quelli alla fine della riga sopra) sarebbe un errore di sintassi (come l'assenza di un nome, in quell'esempio). Con il +, lo rende un'espressione di funzione, il che significa che il nome è opzionale e che si traduce in un riferimento alla funzione, che può essere richiamato, per cui le parentesi sono validi.

+è solo una delle opzioni. Può anche essere -, !, ~, o semplicemente su qualsiasi altro operatore unario. In alternativa, puoi usare le parentesi (questo è più comune, ma né più né meno corretto sintatticamente):

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

12
Altre elaborazioni sono qui, benalman.com/news/2010/11/…
Kundan Singh Chouhan,

159
Non possiamo dire che il paren wrapping sia una notazione superiore? Conosco molto bene le parentesi che servono a racchiudere espressioni. Non è affatto chiaro cosa stia facendo + in questo caso se non si conosce già questa arcana stranezza di js.
Chris,

1
Nota: tra le due opzioni di parentesi, jsLint preferisce la seconda. Penso che jsHint sia meno esigente.
Beetroot-Beetroot

43
Una delle librerie comunemente usate che usa la notazione "più" è Bootstrap (che è come ho finito per leggere questo thread).
Ville,


95

Affiliata alla risposta di @ TJCrowder, +viene solitamente utilizzata per forzare il cast numerico di un valore, come spiega questa risposta SO . In questo caso viene chiamato "unary plus operator" (per facilitare la ricerca su Google).

var num = +variant;

Quindi di fronte a una funzione può essere un modo per forzare il risultato della funzione ad essere interpretato come un numero. Dubito che accada ancora, ma teoricamente la JIT potrebbe usarlo per compilare la funzione come una funzione solo numerica ecc. Tuttavia, per evitare che l'unario più sia una concatenazione quando usato in un'espressione più grande, avresti bisogno di parentesi:

blah + (+(function(){ var scope; return "4"; })());

3
Come mai questo ha ottenuto 37 voti positivi? La (+function() { ... })()notazione non può mai essere eseguita senza errori (a parte il fatto che questo non risponde alla domanda).
Whitequark,

6
@whitequark: mancavano un paio di parentesi graffe attorno alla funzione + chiamata. Sospettare che i voti positivi fossero più dovuti alla spiegazione del casting dei numeri.
Phil H,

10
OK, avrei potuto essere pignolo.
Whitequark,

2
@Christoph Sarei propenso a lasciare quelle parentesi lì. In effetti, arriverei al punto di aggiungerli se fossero mancanti. Rende molto più chiaro cosa sta succedendo e previene anche i problemi quando il codice viene minimizzato rimuovendo gli spazi, portando a ciò 3++function...che non è lo stesso.
Benjam,

3
Sebbene su ulteriori riflessioni, ciò +function...non è necessario in sé. Si può ottenere lo stesso risultato con il blah + function( ){ ... }( );quale si annullerebbe la necessità delle parentesi di avvolgimento.
Benjam

61

Quindi la risposta breve è che impedisce un errore di sintassi, usando i risultati della funzione in un modo o nell'altro.

Puoi anche indicare al motore che non sei nemmeno interessato al valore di ritorno utilizzando l' voidoperatore:

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

Naturalmente, anche mettere le parentesi graffe intorno a tutto ciò serve a tale scopo.


45
Vuoto o parentesi sono immensamente preferibili. Sono privi di WTF. Usare + è il tipo di intelligenza che non è molto intelligente.
Peter Wone,

2
Un buon punto Sembra che l'utilizzo di uno degli operatori si sposterebbe contro quello che è attualmente lo standard del settore. Forse gli sviluppatori "fighi" avrebbero optato per questo, altrimenti non vedo ancora il punto di usare qualcosa piuttosto che void o ()
dudewad
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.