Estou escutando uma discussão acalorada sobre Closures, Ruby e Javascript. Detalhes a parte, Javascript suporta funções anônimas (que não são closures) que podem ser passados como argumentos para outras funções.
Não seria otimo que um Array em javascript tivesse o método each para executar um bloco de código para cada elemento desse array? Usando o prototype da entidade Array eu posso adicionar um método each que faz isso:
Array.prototype.each = function(fun) {
if (typeof fun != "function") return;
for (var i=0; i<this.length; i++) {
if(i in this) fun(this[i]);
}
return this;
}
var x = ["cat", "dog", "mouse", "bird"];
x.each(function(i) {
alert(i);
});
Simples, não? Eu ainda posso adicionar outros métodos uteis como o map e o reduce.
São recursos interessantes que podemos utilizar quando for conveniente. Interessante foi descobrir a propriedade arguments, um array com todos os argumentos passados para a função que, se eu conhecesse alguns meses atrás, teria me solucionado alguns problemas
É claro que tudo isso ja vem no Prototype (né peleteiro).
Usando Prototypejs você têm.
Claro, claro, mas a ideia é mostrar que pode ser possivel adicionar outras coisas interessantes — mas com cuidado pois vc esta lidando com o Core da parada
É uma das características que eu mais gosto de JavaScript, o fato dele ser praticamente uma massinha de modelar.
Por que função anônima não é closure? Função anônima (ou lambda) é closure tanto em Ruby quanto em Javascript.
Uai, função anônima não é necessáriamente closure, precisa ter algo amarrado ao contexto anterior, mas pode ser closure
A função anônima do JavaScript é sim uma closure. Basta observar o comportamento das variaveis de fora do escopo dela quando usado dentro dela. Um exemplo muito comum, é o uso de this em setTimeout
var that = this;
setTimeout( function() {
that.something();
}, 100);
Como você bem disse nos comentários Tiago, tem que tomar cuidado pois voê está alterando o javacript em si ao mudar o prototype de Array.
Melhor seria criar um wrapper (MyFancypantsArray) que herda de Array e implementa os métodos extras