Pergunta

Eu entendo o que fechamentos são, mas eu estou tendo alguns problemas grokking exatamente o que o termo closure se refere. Eu vi o termo usado em muitos sites, mas raramente eles concordam com a definição real do mesmo.

  • É as variáveis ??que são mantidos no quadro de pilha?
  • É a função que está sendo devolvido?
  • É o escopo da função exterior?
  • É o escopo da função interna (devolvidos)?
  • É talvez o conceito de manter as variáveis ??na pilha-frame depois de voltar a função?

Alguém pode me dizer exatamente o que closure refere-se a?

Foi útil?

Solução

A partir JavaScript Closures

Dois resumos de uma frase:

Um fechamento é as variáveis ??locais para um função - mantido vivo após a função voltou, ou

Um fecho é uma pilha de quadro que está não desalocada quando a função retorna. (Como se uma 'pilha-frame' eram malloc'ed em vez de estar na pilha!)

Um artigo muito bom sobre o encerramento

Javascript Closures

A "fechamento" é uma expressão (Tipicamente uma função) que pode ter variáveis ??livres, juntamente com uma ambiente que liga essas variáveis (Que "fecha" a expressão).

A explicação simples de um encerramento é ECMAScript que permite interna funções; definições de funções e expressões de função que estão dentro os corpos das funções de outras funções. E que essas funções internas são permitido o acesso a todos os locais variáveis, parâmetros e declarou funções internas dentro do seu exterior funções). Um fecho é formado quando uma dessas funções internas é feita exterior acessível da função em que estava contido, de modo que ele pode ser executado após a função externa Voltou. Altura em que ainda tem acesso às variáveis ??locais, e parâmetros de função interno declarações de sua função exterior. Essas variáveis ??locais, parâmetros e declarações de função (inicialmente) têm os valores que tinham quando a função exterior e pode ser devolvido interagiu com pela função interna.

Um bom exemplo aqui

JavaScript, tempo To Grok fechamentos

Outras dicas

É uma função que "detém" uma referência ou referências a algo em outro escopo. Por exemplo:

var myArrayOfFunctions = [];

for(var i = 0; i<3: i++)
{
    //Note how the function being defined uses i, 
    //where i lives in the parent's scope, this creates a closure
    myArrayOfFunctions[i] = function(a) { return a + i;}    
}

myArrayOfFunctions[0](5);   //Prints 8 WTF!
myArrayOfFunctions[1](5);   //8 again
myArrayOfFunctions[2](5);   //Well, this 8 was expected

Isso acontece porque quando as funções são "criadas", eles não copiar o valor de i, que possuem uma referência ao i, por isso, quando nós chamamos as funções que usar o valor atual de i que é 3.

aqui está uma explicação gráfica.

Para mim, os encerramentos em JS permite que você faça o seguinte.
"A" permanece disponível na função interna quando adicionado a "b" embora seja declarada fora.

function adder(a){
  return function(b){
    return a + b;
  };
}
var add5 = adder(5);
alert( add5(10) );

Para um uso extremo de encerramentos JS, você pode ter um olhar para o código fonte da biblioteca PURE (um motor de templates JS)

Tanto quanto eu posso dizer, um fechamento é uma função definida dentro de outra função que sobrevive âmbito da função pai. Um exemplo comum é retornos de chamada:

function delay_message(msg)
{
     setTimeout(function closure() { alert(msg); }, 1000);
}

Neste caso, o function closure acima é definida dentro do corpo de delay_message, mas a definição da função - assim como msg variável da função pai -. Sobreviver ao âmbito da chamada de função delay_message

Considere o seguinte código que cria um fecho com variáveis ??a e b

closure=(function(){ 

    var a=3
    var b=5 

return  function(operation){ 
          return operation(a,b)
      }
 }())


// The variables a and b are now part of the closure (They are retained even after the outer function returns)


closure(function(x,y){return x+y})  // outputs 8

closure(function(x,y){return x*y}) // outputs 15`

Este encerramento particular pode agora tomar qualquer função que opera sobre as variáveis ??a e b

Essencialmente um fechamento é um corpo da função fechou sobre seus identificadores (variáveis) dentro de seu ambiente local.

Um fecho é um valor da função criada a partir de uma expressão declaração função aninhada ou função (isto é, expressão lambda) cujo corpo contém uma ou mais referências a variáveis ??declarada num exterior (mas não global) âmbito.

meios de fecho uma função (função exterior) contendo uma outra função (função interna).

O encerramento é usado para proteger os dados.

o uso de mais perto é demostrated no link de vídeo fornecer abaixo:

https://www.youtube.com/watch?v=w1s9PgtEoJs

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top