? Quando um fechamento é criado em JavaScript , você pode referenciar variáveis locais de uma função , mesmo depois que a função terminou , com os valores que tinham no final da função. Sempre que você usar uma função dentro de outra função , use " eval " dentro de outra função ou definir uma variável dentro de uma função sem " var ", você cria um encerramento. Muitos programadores criar fechamentos sem perceber pela definição de uma função anônima dentro de uma função . Closures são úteis quando você quer passar variáveis para manipuladores de eventos ou funções de retorno de chamada de AJAX e emular variáveis privadas e métodos em objetos JavaScript . Tenha cuidado ao criar fechamentos , no entanto, pois eles podem causar vazamentos de memória no Microsoft Internet Explorer. Compreender Closures
JavaScript ea maioria das outras linguagens de programação , as variáveis locais de uma função são destruídos após a função termina. No entanto, quando você criar uma função dentro de outra função em JavaScript, as variáveis locais da função exterior são preservados mesmo depois que ele termina , porque as variáveis podem ser referenciados pela função interna . O exemplo abaixo contém uma função " premiado " que cria um fecho através de uma função anônima , o que ele retorna . Chamamos isso de função anônima directamente do exterior , mesmo sem passar pela função pai :
função premiado (nome ) { var vencedor = " Você ganha o prêmio, " + nome; var anunciar = function () { alert ( vencedor );} ; if ( Math.floor ( Math.random () * 11) == 7) voltar anunciar ; return null; }
if ( var SayIt = premiado ( " Steve " ) ) SayIt ();
Passando parâmetros para manipuladores de eventos
Um uso de encerramentos é fazer com que as variáveis disponíveis para manipuladores de eventos. Considere o seguinte exemplo em que um fechamento é criado por uma função anônima definida no " SetHandler . " A função anônima faz referência a um parâmetro de " SetHandler . " No ponto o evento é acionado , mesmo que " SetHandler " tenha terminado , os valores de suas variáveis , incluindo seus parâmetros , na conclusão da função são preservados para a função anônima . A tampa separada é criada para cada iteração do loop.
Função SetHandler ( porta , prêmio ) { door.addEventListener ( "click" , function () { alert (" Prêmio de porta " + porta + "é" + prêmio );} , false); }
window.onload = function ( ) {for (var i = 1; i < = 3; i + +) { SetHandler ( document.getElementById ( " porta " + i) , prêmio [i] );}}
Passando Parâmetros para AJAX callback Functions
semelhante ao exemplo anterior, podemos passar parâmetros para funções de retorno de chamada de AJAX com fechos . Se você fizer uma chamada de AJAX em que a variável pedido é global, você eliminou a chance de passar um parâmetro para a função de callback porque um único pedido global é criado. Ao fazer o pedido variável local , você pode criar um fechamento e dar a função de retorno de acesso a dados específicos do pedido . No exemplo abaixo , criamos um fechamento , definindo a função de retorno de chamada que usa uma variável local para a sua função de pai. Um callback separada é criada para cada uma das 10 chamadas " makeRequest "
processo function () {for . (Var i = 0; i < 10; i + +) { makeRequest (i );}
função
makeRequest (que ) { var pedido ; usethis var = pesquisa (que ); if ( window.XMLHttpRequest ) { request = new XMLHttpRequest (); } else if ( window.ActiveXObject ) { request = new ActiveXObject ( " Microisoft.XMLHTTP ");} request.onreadystatechange = function () { parse ( usethis );} request.open ( " GET " , url ); request.send ();}
privada variáveis e métodos em JavaScript
JavaScript, todos os membros de um objeto são públicos, diferentemente de outras linguagens orientadas a objetos que permitem variáveis privadas e métodos. Closures permitem reproduzir os métodos e variáveis privadas em JavaScript. No exemplo a seguir, o objeto "segredos " é criado e executado mediante definição. Quando executado, ele contém um objeto anônimo com dois métodos: "show" e "super ", o que leva um parâmetro. Tanto a variável " secretCode " ea função " supersecreto " só pode ser acessado através de dois métodos no " segredos " do objeto. Com efeito, eles são membros privados de
segredos var
= function ( ) {var secretCode = (( (1 + Math.random ()) * 0x100000 )