O que é closures …?
procurei no google mas não encotrei uma definição alguém sabe do que se trata…?
Closures
6 Respostas
Em algumas liguagens um closure pode ser definido quando uma função, cria funções interna (que podem ser utilizadas externamente), e ambas acessam as mesmas variaveis locais da função “pai”. Em runtime, um closure é formado quando as funções internas são apontadas a variaveis para ser chamadas em outro scopo. Assim podem acessar aquelas variaveis da “função pai”
Tem um exemplo a wikipedia que da para ver bem isto funfando:
var f, g;
function foo()
{
var x = 0;
f = function() { ++x; };
g = function() { --x; };
x = 1;
print(f()); // "2"
}
foo();
//A variavel x é interna da função foo, so que aqui ela não existe, so que permanece o estado da mesma (variavel x, interna da função foo)
g(); // "1"
f(); // "2"
Referencia: http://en.wikipedia.org/wiki/Closure_(computer_science)
valew cara
Outro exemplo cara:
Pessoa=function()
{
this.nome;
this.getNome=function()
{
return this.nome;
}
this.setNome=function(nome)
{
this.nome=nome;
}
}
chama=new Pessoa();
chama.setNome("Edson");
alert(chama.getNome())
Uma vantagem interessante dos closures é vc passar um bloco de codigo para um método.
A = [ 1 , 2 , 3]
A.each{ |x| puts "#{x} -> #{x**2}" }
1 -> 1
2 -> 4
3 -> 9
neste exemplo em ruby, o meu array A possui um método chamado each, que executa o bloco de código passado para cada elemento do vetor.
O bloco de código que eu passei equivale a uma função que recebe um parametro 'x' e imprime o valor de x e o seu quadrado.
Imagine que vc tem um array de objetos e envia um bloco de codigo que vai operar sobre cada objeto, ou então ordenar um array de acordo com um bloco de código informado, os exemplos são muitos -- mas parece estranho a primeira vista.
Tinha entendido de como usar a interface org.apache.commons.collections.Closure. Mas o conceito que a galera comenta eh mais ou menos do que a Interface faz.
Favor nao confundir closures com blocos e procs. Uma closure “acontece” apenas quando um valor definido internamente eh usado fora do contexto de onde ele se originou:
var foo = function() {
return function() {
return function() {
return "closure!";
}
}
}()();
assert(foo == "closure");
No exemplo do peczenyj, por exemplo, nao existe uma closure, ja que o bloco passado pro each() faz o puts diretamente. Isso aqui seria uma versao com closures da mesma coisa:
a = [1,2,3]
a.collect{|x| "#{x} = #{x+1}" }.each {|x| puts x}