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?
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?
Respostas:
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 function
parecerá 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!"); }());
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"; })());
(+function() { ... })()
notação nunca pode ser executada sem erros (além do fato de que isso não responde à pergunta).
3++function...
que não seja o mesmo.
+function...
por si só é desnecessário. O mesmo resultado pode ser obtido com o blah + function( ){ ... }( );
que negaria a necessidade dos suportes de embalagem.
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 void
operador:
void function() { console.log("Foo!"); }();
Obviamente, colocar aparelhos em volta da coisa toda também serve a esse propósito.