with - função de javascript levando estrondo! sintaxe




w3schools titles (4)

Eu tenho visto esta sintaxe em algumas bibliotecas agora e estou me perguntando qual é o benefício. (note que estou bem ciente dos encerramentos e do que o código está fazendo, estou preocupado apenas com as diferenças sintáticas)

!function(){
  // do stuff
}();

Como alternativa ao mais comum

(function(){
  // do stuff
})();

para auto invocar funções anônimas.

Estou me perguntando algumas coisas. Em primeiro lugar, o que está permitindo que o exemplo principal funcione de verdade? Por que o estrondo é necessário para tornar esta afirmação sintaticamente correta? Também me disseram que o + funciona, e tenho certeza que alguns outros, no lugar de !

Em segundo lugar, qual é o benefício? Tudo o que posso dizer é que ele salva um único caractere, mas não consigo imaginar que esse benefício seja tão grande para atrair muitos usuários. Existe algum outro benefício que eu estou perdendo?

A única outra diferença que eu posso ver seria o valor de retorno da função auto-chamada, mas em ambos os exemplos, nós realmente não nos importamos com o valor de retorno da função, uma vez que ela é usada apenas para criar um fechamento. Então alguém pode me dizer por que alguém pode usar a primeira sintaxe?


Além das coisas que já foram ditas, a sintaxe com o! é útil se você escrever javascript sem ponto e vírgula:

var i = 1
!function(){
  console.log('ham')
}()

i = 2
(function(){
  console.log('cheese')
})()

O primeiro exemplo gera "ham" como esperado, mas o segundo lançará um erro porque a instrução i = 2 não é terminada devido aos parênteses a seguir.

Também em arquivos javascript concatenados, você não precisa se preocupar se o código anterior não tiver ponto e vírgula. Portanto, não há necessidade do comum (function () {}) (); Para ter certeza que você não vai quebrar.

Eu sei que a minha resposta é meio tarde, mas eu acho que não foi mencionado ainda :)


Como você pode ver jsperf.com/self-invoking-function , a melhor maneira de fazer os métodos auto-invocados em javascript é usando:

(function(){}()); -> 76,827,475 ops/sec

!function(){}();  -> 69,699,155 ops/sec

(function(){})(); -> 69,564,370 ops/sec

Então, com negar "!" e todos os outros operadores unários como +, -, ~, delete, void, muito foi dito, apenas para resumir:

!function(){
  alert("Hi!");
}(); 

Ou

void function(){
  alert("Hi!");
}();

Ou

delete function(){
  alert("Hi!");
}();

E mais alguns casos com operadores binários para diversão :)

1 > function() {
   alert("Hi!"); 
}();

Ou

1 * function() {
   alert("Hi!"); 
}();

Ou

1 >>> function() {
   alert("Hi!"); 
}();

Ou mesmo

1 == function() {
   alert("Hi!"); 
}();

Deixando o ternário para outra pessoa pessoal :)


Idealmente você deveria ser capaz de fazer tudo isso simplesmente como:

function(){
  // do stuff
}(); 

Isso significa declarar função anônima e executá-la. Mas isso não funcionará devido a especificidades da gramática JS.

Portanto, a forma mais curta de conseguir isso é usar alguma expressão, por exemplo, UnaryExpression (e, portanto, CallExpression):

!function(){
  // do stuff
}(); 

Ou para a diversão:

-function(){
  // do stuff
}(); 

Ou:

+function(){
  // do stuff
}(); 

Ou até mesmo:

~function(){
  // do stuff
  return 0;
}( );




syntax