Código Javascript
:
Ver original/*
Aqui estas extendiendo el prototipo del Objeto Function
y le estas agregando un método bind.
Se pueden lograr patrones muy eficientes con este modelo
pero no lo recomiendo a menos que sepas lo que haces.
*/
Function.prototype.bind = function(scope)
{
var _function = this;// aqui this hace referencia a la funcion en donde bind se ejecuta.
//por ejemplo, en ej1 this hace referencia a
//function(){
// alert(this);
//}
return function() { //una vez que se llame a bind, se ejecuta el codigo y
//la funcion original es reemplazada por esta funcion
//Esta funcion simplemente toma la copia de la funcion original que guardo
//hace algunas lineas y la llama con apply para poder cambiar el
//contexto en el que se ejecuta, o como algunos dirian, para cambiar el
//valor de this.
return _function.apply(scope, arguments);
}
}
//Lo que sige son los ejemplos, no tienen mucho de especial ya que el
//codigo ha sido explicado anteriormente
//pero ejemplo 2 tiene otra cosa interesante.
//ej 1
var fn = function(){
alert(this);
}.bind(objetos);
fn();
//ej 2
//En este ejemplo vemos que se usa una funcion anonima autoejecutable para
//poder ejecutar el bind. Este tiene la particulariedad que una vez que la funcion
//anonima regresa, muere y no deja huella en el ambito global. Lo mas probable
//es que sea victima de garbage collector.
for(var i in objetos)
{
(function(){//esta es la funcion anonima auto-ejecutable.
alert(this.className);
}.bind(objetos[i]))();
}