Em javascript, quando você deseja usar isso:
(function(){
//Bunch of code...
})();
por cima disto:
//Bunch of code...
Em javascript, quando você deseja usar isso:
(function(){
//Bunch of code...
})();
por cima disto:
//Bunch of code...
Respostas:
É tudo sobre escopo variável. As variáveis declaradas na função de execução automática, por padrão, estão disponíveis apenas para codificar na função de execução automática. Isso permite que o código seja gravado sem a preocupação de como as variáveis são nomeadas em outros blocos de código JavaScript.
Por exemplo, conforme mencionado em um comentário de Alexander :
Isso primeiro registra
3
e depois gera um erro no próximo,console.log
porquefoo
não está definido.fonte
var
, assim...function(){ foo=3;}
:? Isso definiria uma variável global, certo?function(){ var foo = 3; alert(foo); }; alert(foo);
Então, eu ainda não entendoSimplista. Tão muito normal, é quase reconfortante:
No entanto, e se eu incluir uma biblioteca javascript realmente útil na minha página que traduza caracteres avançados em suas representações no nível base?
Espere o que?
Quero dizer, se alguém digitar um personagem com algum tipo de sotaque, mas eu só quero caracteres em 'inglês' AZ no meu programa? Bem ... os caracteres espanhol 'ñ' e francês 'é' podem ser traduzidos para caracteres base de 'n' e 'e'.
Então, alguém legal escreveu um abrangente conversor de caracteres que eu posso incluir no meu site ... eu o incluo.
Um problema: ele tem uma função chamada 'name' igual à minha função.
Isso é chamado de colisão. Temos duas funções declaradas no mesmo escopo com o mesmo nome. Queremos evitar isso.
Então, precisamos escopo nosso código de alguma forma.
A única maneira de escopo do código em javascript é envolvê-lo em uma função:
Isso pode resolver o nosso problema. Agora tudo está fechado e só pode ser acessado de dentro de nossas chaves de abertura e fechamento.
Temos uma função em uma função ... que é estranha de se ver, mas totalmente legal.
Apenas um problema. Nosso código não funciona. Nossa variável userName nunca é ecoada no console!
Podemos resolver esse problema adicionando uma chamada à nossa função após o bloco de código existente ...
Ou antes!
Uma preocupação secundária: quais são as chances de o nome 'principal' ainda não ter sido usado? ... muito, muito magro.
Precisamos de mais escopo. E alguma maneira de executar automaticamente nossa função main ().
Agora chegamos às funções de execução automática (ou auto-executáveis, auto-executáveis, qualquer que seja).
A sintaxe é estranha como o pecado. No entanto, funciona.
Quando você coloca uma definição de função entre parênteses e inclui uma lista de parâmetros (outro conjunto ou parênteses!), Ela atua como uma chamada de função .
Então, vejamos nosso código novamente, com alguma sintaxe auto-executável:
Portanto, na maioria dos tutoriais que você lê, agora você será bombardeado com o termo 'auto-execução anônima' ou algo semelhante.
Depois de muitos anos de desenvolvimento profissional, eu fortemente exortá-lo a nomear todas as funções que você escreve para fins de depuração.
Quando algo der errado (e ocorrerá), você verificará o backtrace no seu navegador. É sempre mais fácil restringir os problemas de código quando as entradas no rastreamento da pilha têm nomes!
Muito longo e espero que ajude!
fonte
:)
Eu sou um grande fã :) disso porque:
Enorme - (Por que você deveria dizer que é bom?)
Mais aqui .
fonte
Namespacing. Os escopos do JavaScript são de nível de função.
fonte
Não acredito que nenhuma das respostas menciona globais implícitas.
A
(function(){})()
construção não protege contra globais implícitas, o que para mim é a maior preocupação, consulte http://yuiblog.com/blog/2006/06/01/global-domination/Basicamente, o bloco de funções garante que todos os "vars globais" dependentes que você definiu estejam confinados ao seu programa, não o protegem contra a definição de globais implícitos. JSHint ou similar pode fornecer recomendações sobre como se defender contra esse comportamento.
A
var App = {}
sintaxe mais concisa fornece um nível semelhante de proteção e pode ser agrupada no bloco de funções quando estiver em páginas 'públicas'. (consulte Ember.js ou SproutCore para obter exemplos reais de bibliotecas que usam essa construção)No que diz respeito às
private
propriedades, elas são superestimadas, a menos que você esteja criando uma estrutura ou biblioteca pública, mas se precisar implementá-las, Douglas Crockford tem algumas boas idéias.fonte
Eu li todas as respostas, algo muito importante está faltando aqui , eu vou BEIJAR. Existem 2 razões principais, pelas quais eu preciso de Funções Anônimas Autoexecutáveis ou, melhor dizendo, " Expressão de Função Imediatamente Invocada (IIFE) ":
O primeiro foi explicado muito bem. Para o segundo, estude o seguinte exemplo:
Atenção 1: Não estamos atribuindo uma função a
MyClosureObject
, mais ainda, o resultado de invocar essa função . Estar ciente de()
última linha.Atenção 2: O que você precisa saber adicionalmente sobre funções em Javascript é que as funções internas têm acesso aos parâmetros e variáveis das funções, elas são definidas dentro.
Vamos tentar algumas experiências:
Eu posso
MyName
usargetMyName
e funciona:A seguinte abordagem ingênua não funcionaria:
Mas posso definir outro nome e obter o resultado esperado:
Edit: No exemplo acima, ele
MyClosureObject
foi projetado para ser usado sem onew
prefixo; portanto, por convenção, ele não deve ser capitalizado.fonte
Existe um parâmetro e o "Grupo de códigos" retorna uma função?
Fecho. O valor de
something
é usado pela função atribuída aa
.something
pode ter algum valor variável (para loop) e toda vez que uma tiver uma nova função.fonte
var x = something;
na função exterior sobrex
como parâmetro, no entanto: imo que é mais legível desta forma ...x
e depende directamente do escopo léxico, ou sejadocument.write(something)
...Isolamento do escopo, talvez. Para que as variáveis dentro da declaração da função não poluam o espaço para nome externo.
É claro que, na metade das implementações de JS existentes, elas serão assim mesmo.
fonte
Aqui está um exemplo sólido de como uma função anônima auto-invocável pode ser útil.
Resultado:
10, 10, 10, 10, 10...
Resultado:
0, 1, 2, 3, 4...
fonte
let
lugar dovar
primeiro caso, tudo ficará bem.Uma diferença é que as variáveis que você declara na função são locais, portanto desaparecem quando você sai da função e não entram em conflito com outras variáveis em outro código.
fonte
Como as funções em Javascript são objetos de primeira classe, definindo-o dessa maneira, ele define efetivamente uma "classe" como C ++ ou C #.
Essa função pode definir variáveis locais e ter funções dentro dela. As funções internas (métodos de instância efetivamente) terão acesso às variáveis locais (variáveis de instância efetivamente), mas serão isoladas do restante do script.
fonte
Função auto-invocada em javascript:
Uma expressão de auto-chamada é invocada (iniciada) automaticamente, sem ser chamada. Uma expressão auto-invocadora é invocada logo após ser criada. Isso é basicamente usado para evitar conflitos de nomes e para obter encapsulamento. As variáveis ou objetos declarados não estão acessíveis fora desta função. Para evitar os problemas de minimização (filename.min), use sempre a função auto-executada.
fonte
A função de execução automática é usada para gerenciar o escopo de uma variável.
O escopo de uma variável é a região do seu programa em que está definida.
Uma variável global tem escopo global; ele é definido em qualquer lugar do seu código JavaScript e pode ser acessado de qualquer lugar do script, mesmo em suas funções. Por outro lado, variáveis declaradas dentro de uma função são definidas apenas dentro do corpo da função. São variáveis locais, têm escopo local e só podem ser acessadas nessa função. Os parâmetros da função também contam como variáveis locais e são definidos apenas dentro do corpo da função.
Como mostrado abaixo, você pode acessar a variável variável global dentro de sua função e também observar que, no corpo de uma função, uma variável local tem precedência sobre uma variável global com o mesmo nome.
Então, basicamente, uma função de execução automática permite que o código seja escrito sem se preocupar com a forma como as variáveis são nomeadas em outros blocos de código javascript.
fonte
Na verdade, a função acima será tratada como expressão de função sem um nome.
O principal objetivo de agrupar uma função com parênteses próximos e abertos é evitar poluir o espaço global.
As variáveis e funções dentro da expressão da função tornaram-se privadas (ie), não estarão disponíveis fora da função.
fonte
A resposta curta é: para evitar a poluição do escopo Global (ou superior).
O IIFE (Expressões de Função Invocadas Imediatamente) é a melhor prática para escrever scripts como plug-ins, complementos, scripts de usuário ou qualquer outro script que possa funcionar com scripts de outras pessoas . Isso garante que qualquer variável que você defina não produza efeitos indesejados em outros scripts.
Essa é a outra maneira de escrever a expressão IIFE. Eu pessoalmente prefiro este método a seguir:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void
A partir do exemplo acima, é muito claro que o IIFE também pode afetar a eficiência e o desempenho, porque a função que se espera que seja executada apenas uma vez será executada uma vez e depois despejada no vazio para sempre . Isso significa que a declaração de função ou método não permanece na memória.
fonte
void
antes. Eu gosto disso.Primeiro você deve visitar o MDN IIFE . Agora, alguns pontos sobre isso
fonte
Parece que esta pergunta já foi respondida, mas postarei minha opinião de qualquer maneira.
Sei quando gosto de usar funções auto-executáveis.
A função permite que eu use algum código extra para definir os atributos e propriedades childObjects para um código mais limpo, como definir variáveis usadas com frequência ou executar equações matemáticas; Oh! ou verificação de erro. em vez de se limitar à sintaxe de instanciação de objetos aninhados de ...
A codificação em geral tem muitas maneiras obscuras de fazer as mesmas coisas, fazendo você pensar: "Por que se preocupar?" Mas novas situações continuam surgindo, onde você não pode mais confiar apenas nos princípios básicos / principais.
fonte
Dada a sua pergunta simples: "Em javascript, quando você deseja usar isso: ..."
Eu gosto das respostas de @ken_browning e @ sean_holding, mas aqui está outro caso de uso que não vejo mencionado:
onde Node.insert é alguma ação assíncrona.
Não posso simplesmente chamar em espera sem a palavra-chave assíncrona na declaração da minha função, e não preciso de uma função nomeada para uso posterior, mas preciso aguardar a chamada de inserção ou preciso de outros recursos mais ricos (quem sabe?) .
fonte
IIRC permite criar propriedades e métodos privados.
fonte