Cita:
Iniciado por _cronos2 Eeeeeerm... ¿un poco de documentación por favor? XD
en realidad no es tan complicado.
bind lo que hace es devolver una funcion donde enlaza otra funcion con un objeto en particular. no entiendo porque tanto rodeo cuando
call y
apply cumplen con esa expectativa. veamoslo parte por parte...
Código:
Function.prototype.bind = function(scope) {
...
}
bind es un metodo que se hereda en todas las funciones puesto que esta declarado en el prototipo de Function. el argumento
scope es el objeto que se desea enlazar con otra funcion.
la variable
_function retiene la referencia de la funcion a enlazar con el objeto. esta variable se crea para poder hacer un closure. recuerda que
this siempre hace referencia a un objeto, al estar ubicado en el prototipo del objeto Function,
this siempre obtiene como referencia la funcion desde el cual se invoca
bind. es decir, en
alert.bind(),
this hace referencia a
alert.
Código:
return function() {
return _function.apply(scope, arguments);
}
una funcion anonima que se devuelve cuando se invoca
bind. dentro de esa funcion anonima contiene lo siguiente.
Código:
return _function.apply(scope, arguments);
aqui se utiliza la variable
_function el cual es la referencia de
this o lo mismo que la funcion a enlazar. en el ejemplo anterior,
_function vendria siendo la funcion
alert. entonces, desde dicha referencia se invoca el metodo
apply pasando como argumento el objeto (
scope) al cual se va aplicar la funcion mas posibles argumentos (
arguments) cuando se invoca la funcion devuelta por
bind.
en mi opinion, en muy pocos casos le veo utilidad y mas aun pudiera ser peligroso si el navegador no maneja bien el colector de basura (garbage collector) como es el caso de iexplorer. si yo tuviera que enlazar una funcion a un objeto, simplemente usaria directamente
call o
apply. usando el mismo ejemplo de @masterpuppet
Código:
// ejemplo con bind ;
var fn = function(){
alert(this);
}.bind(objetos);
fn();
// ejemplo nativo ;
(function(){alert(this);}).call(objetos);