Os encerramentos em javascript
Em javascript, podemos usar closures para acessar a variável privada dentro de um wrapper de função, usando uma função anônima aninhada.
var f, g;
function foo() {
var x = 0;
f = function() { return ++x; };
g = function() { return --x; };
x = 1;
alert('inside foo, call to f(): ' + f()); // "2"
}
foo();
alert("call to g(): " + g()); // "1"
alert("call to f(): " + f()); // "2"
Fechamentos e escopo
É importante notar que ao fazer um fechamento, ele leva o último valor da variável da função wrapper. Um caso comum é quando usamos um loop.
window.onload = function(){
var el = document.getElementById("anyElement");
var events = [ "click", "mouseover", "mouseout" ];
for(var i=0;i<events.length;i++){
var item = events[i];
el[ "on" + item ] = function(){
alert( "event: " + item );
}
}
}
Observe que a atribuição de el [“on” + item] “é um encerramento. Ao executar este exemplo, observe que em cada evento onclick, onmouseover e onmouseout chamam o encerramento e mouseout sempre alerta, o último valor no loop leva o item variável .
Podemos resolver isso criando um novo escopo por uma função anônima que é executada automaticamente. portanto, em cada execução desta função, o item assume novos valores e a função assume o último valor contido na função wrapper em cada iteração é diferente.
Isso pode ser especialmente útil considerando que o javascript não oferece suporte a OOP, em vez de podermos criar uma pseudoclasse usando esse recurso.