JavaScript mais sinal na frente da expressão da função


868

Estive procurando informações sobre funções imediatamente invocadas e em algum lugar me deparei com essa notação:

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

Alguém pode me explicar o que +significa / faz o sinal na frente da função?


17
Ben Alman explica tudo aqui: mths.be/iife
Mathias Bynens

Respostas:


1321

Força o analisador a tratar a parte que segue +como expressão. Isso geralmente é usado para funções que são chamadas imediatamente, por exemplo:

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

Sem o +lá, se o analisador estiver em um estado em que espera uma instrução (que pode ser uma expressão ou várias instruções de não expressão), a palavra functionparecerá o início de uma declaração de função em vez de uma expressão de função e, portanto, a ()seguinte (os que estão no final da linha acima) seriam um erro de sintaxe (assim como a ausência de um nome, nesse exemplo). Com o+ , torna-o uma expressão de função, o que significa que o nome é opcional e resulta em uma referência à função, que pode ser chamada, para que os parênteses sejam válidos.

+é apenas uma das opções. Ele também pode ser -, !, ~, ou apenas sobre qualquer outro operador unário. Como alternativa, você pode usar parênteses (isso é mais comum, mas nem mais nem menos correto, sintaticamente):

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

12
Mais de elaboração está aqui, benalman.com/news/2010/11/...
Kundan Singh Chouhan

159
Não podemos dizer que o empacotamento de parênteses é uma notação superior? Estou muito familiarizado com parens que servem para abranger expressões. Não está claro o que o + está fazendo neste caso, se você ainda não conhece esse truque arcano de js.
Chris

1
Nota: Das duas opções de parens, o jsLint prefere a segunda. Eu acho que o jsHint é menos exigente.
Beterraba-Beterraba

43
Uma das bibliotecas comumente usadas que usa a notação "plus" é o Bootstrap (que foi como eu acabei de ler este tópico).
Ville


95

Subsidiária da resposta do @ TJCrowder, +geralmente é usada para forçar a conversão numérica de um valor, conforme explica essa resposta do SO . Nesse caso, ele é chamado de "operador unário +" (para facilitar a busca no Google).

var num = +variant;

Portanto, na frente de uma função, pode ser uma maneira de forçar o resultado da função a ser interpretado como um número. Duvido que isso aconteça ainda, mas teoricamente o JIT poderia usar isso para compilar a função como uma função apenas numérica etc. No entanto, para impedir que o unário mais seja uma concatenação quando usado em uma expressão maior, você precisará de parênteses:

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

3
Como isso conseguiu 37 votos positivos? A (+function() { ... })()notação nunca pode ser executada sem erros (além do fato de que isso não responde à pergunta).
whitequark

6
@whitequark: Perdeu um par de chaves ao redor da função + chamada. Suspeito que os votos positivos foram mais por causa da explicação do elenco de números.
Phil H

10
OK, eu poderia ter sido nitpicking.
whitequark

2
@Christoph, eu estaria inclinado a deixar esses suportes lá. Na verdade, eu chegaria ao ponto de adicioná-los se eles estivessem ausentes. Isso torna muito mais claro o que está acontecendo e também evita problemas quando o código é minimizado, removendo os espaços, levando a 3++function...que não seja o mesmo.
Benjam

3
Embora em uma reflexão mais aprofundada, o +function...por si só é desnecessário. O mesmo resultado pode ser obtido com o blah + function( ){ ... }( );que negaria a necessidade dos suportes de embalagem.
Benjam

61

Portanto, a resposta curta é que ela evita um erro de sintaxe, usando os resultados da função de uma maneira ou de outra.

Você também pode instruir o mecanismo de que nem sequer está interessado no valor de retorno usando o voidoperador:

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

Obviamente, colocar aparelhos em volta da coisa toda também serve a esse propósito.


45
Vazios ou parênteses são imensamente preferíveis. Eles são livres de WTF. Usar + é o tipo de inteligência que não é muito inteligente.
quer

2
Um bom argumento. Parece que o uso de um dos operadores passaria contra o que atualmente é o padrão da indústria. Talvez desenvolvedores "miúdo fresco" iria optar por ele, caso contrário, eu ainda não estou vendo um ponto de usar algo em vez de nula ou ()
dudewad
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.