Ver Mensaje Individual
  #13 (permalink)  
Antiguo 05/02/2011, 20:34
Avatar de zerokilled
zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Crear objeto THIS

Cita:
Iniciado por _cronos2 Ver Mensaje
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.
Código:
    var _function = this;
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);
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 05/02/2011 a las 20:39