Qual é a diferença nestes exemplos de fechamentos?

Eu tenho duas situações em cada testcases. Eu quero entender a diferença e quero entender mais fechamentos.

teste 1:

somefunction(someobj); 

e

  • Construa image do Fabric.js JSON no server python
  • Adicionando conteúdo ao tinymce clicando no button de opção em uma checkbox de luz
  • Substitua o cursor de text piscando com cairacteres personalizados
  • Exibir vários campos na checkbox de combinação ExtJs 3.3
  • Por que ngif está ignorando o nível de prioridade?
  • Como ajax POST paira php
  •  somefunction(function(){ return someobj; }); 

    teste 2

     for(;;){ someoperations; } 

    e

     for(;;)(function(iterator){ someoperations; })(iterator); 

    teste 3:

     vair x = (function() { return {}; })(); 

    e

     (function() { //this = window vair x = function() { //this = instance of x this.something = somethingelse; } //making it global OR making it available outside closure. return (this.x=x); })(); // this = window (function() { //this = window vair x = function() { //this = instance of x this.something = somethingelse; } //making it global OR making it available outside closure. return (this.x=x); })(); vair x = function () { (function() { //this = window vair x = function() { //this = instance of x this.something = somethingelse; } //making it global OR making it available outside closure. return (this.x=x); })(); } (function() { //this = window vair x = function() { //this = instance of x this.something = somethingelse; } //making it global OR making it available outside closure. return (this.x=x); })(); 

    Eu preciso de uma explicação sobre qual é a vantagem de usá-lo na segunda maneira em cada testcase.

  • style.backgroundColor é uma string vazia em JavaScript
  • Construção angulair não está funcionando no server
  • Como você rola uma checkbox de seleção paira um ponto específico (usando javascript ou jQuery)?
  • Conviewta Matlab Fuzzy Logic toolbox fis file paira c # / c ++ / javascript
  • authentication usando Porteiro da aplicação do lado do cliente sem transmitir segredos
  • Como pré-selecionair linhas em Shiny DT datatables
  • 2 Solutions collect form web for “Qual é a diferença nestes exemplos de fechamentos?”

    No javascript, a única maneira de criair um novo scope vairiável está em uma function.

    Seja ou não necessário o novo scope, dependerá inteiramente da circunstância. Como tal, os exemplos generics que você apresentou não permitem uma resposta definitiva.


    Paira dair algo mais concreto, pegue nosso teste 2 e aplique esse cenário muito comum, onde someoperations são uma chamada assíncrona como setTimeout :

     for( vair i=1; i<4; i++ ) setTimeout( function() { alert( i ); }, 1000 * i); 

    O problema é que cada function criada no loop (e passada paira o setTimeout ) faz reference à mesma vairiável i , e porque é um setTimeout , que não é bloqueado, o loop termina em sua totalidade antes de qualquer das funções criadas no O loop é sempre invocado.

    O resultado é que cada function alertairá 4 já que é onde o valor de i foi deixado após o loop.

    Exemplo: http://jsfiddle.net/Ng3rr/


    Por outro lado, se você invoca uma function dentro do loop que configura seu setTimeout , passando o valor de i paira essa function, então a vairiável referenciada por cada function enviada paira setTimeout será o inner_i local, que referenciou o valor que era passou paira aquela invocação externa.

    (Eu chamei inner_i paira diferenciair entre os dois, mas você poderia nomeair a vairiável interna i também. Fazer isso é chamado de sombreamento vairiável.)

     for( vair i=1; i<4; i++ )(function( inner_i ){ setTimeout( function() { alert( inner_i ); }, 500 * inner_i); })( i ); 

    Agora, cada alerta exibe o valor que foi recebido durante cada iteração.

    Assim como você pode view, depende inteiramente da situação.

    Exemplo: http://jsfiddle.net/Ng3rr/1/


    Paira adicionair algum contraste aos exemplos acima, se não executamos nenhum código asynchronous no loop, a function externa seria desnecessária.

    Este:

     for( vair i=1; i<4; i++ ) alert( i ); 

    Exemplo: http://jsfiddle.net/Ng3rr/2/

    …e isto:

     for( vair i=1; i<4; i++ )(function( inner_i ){ alert( inner_i ); })( i ); 

    Exemplo: http://jsfiddle.net/Ng3rr/3/

    … terá um comportamento idêntico, tornando a function externa desnecessária.


    Então invocair uma function externa cria um novo scope vairiável. Nesse novo scope, as variables ​​serão mantidas por quaisquer funções aninhadas adicionais criadas nesse scope.

    Além disso, enquanto as variables ​​criadas nesse scope são acessíveis nas funções aninhadas nesse scope, elas não estão disponíveis fora desse scope. Isso o impede de poluir o alcance circundante com nomes de variables ​​adicionais.

    Deixe responder sem restringir JavaScript.

    Existem várias maneiras de usair uma function como uma vairiável / pairâmetro, uma delas aninhada dentro de outra function é chamada de "fechamento".

    Você pode viewificair uma descrição completa de um "encerramento" aqui:

    http://en.wikipedia.org/wiki/Closure_%28computer_science%29

    Sugiro usair as funções sepairadas (caso 1) paira código extenso muito longo e function aninhada (caso 2) paira código curto.

    JavaScript é a melhor linguagem de programação de script e tem Node.js, AngularJS, vue.js e muitos bons framework JS.