Foros del Web » Programando para Internet » Javascript »

Duda con metodo Bind usado por frameworks

Estas en el tema de Duda con metodo Bind usado por frameworks en el foro de Javascript en Foros del Web. Bueno, en algunas ocaciones tenemos objetos que abren nuevas funciones, llega un punto en el que la variable "this" se desvincula y perdemos el contacto ...
  #1 (permalink)  
Antiguo 18/07/2010, 09:18
Avatar de minkweb  
Fecha de Ingreso: septiembre-2005
Mensajes: 443
Antigüedad: 18 años, 7 meses
Puntos: 14
Duda con metodo Bind usado por frameworks

Bueno, en algunas ocaciones tenemos objetos que abren nuevas funciones, llega un punto en el que la variable "this" se desvincula y perdemos el contacto con nuestro objeto, ahora no entiendo por que me ocurre esto

En este ejemplo, la variable this llega como window...
Código Javascript:
Ver original
  1. addMethod = function(Obj, Name, Method){
  2.     Obj.prototype[Name] = Method
  3. }
  4.  
  5. bind = function(scope){
  6.     var alias = this;
  7.     alert(scope)
  8.     return function(){ return alias.apply(scope, arguments)}
  9. }
  10.    
  11. addMethod(Function, 'bind',bind)
  12.  
  13.  
  14. mifuncion ={
  15.     algo: function(){
  16.         this.nombre = 'carlos';
  17.     },
  18.     name: function(){
  19.         alert('tu'+ this.algo)
  20.     }.bind(this)
  21. }
  22.  
  23. mifuncion.algo();
  24. mifuncion.name();


En este otro si funciona...
Código Javascript:
Ver original
  1. addMethod = function(Obj, Name, Method){
  2.     Obj.prototype[Name] = Method
  3. }
  4.  
  5. bind = function(scope){
  6.     var alias = this;
  7.     alert(scope)
  8.     return function(){ return alias.apply(scope, arguments)}
  9. }
  10.    
  11. addMethod(Function, 'bind',bind)
  12.  
  13. mifuncion ={
  14.  
  15.     algo: function(){
  16.         this.nombre = 'carlos';
  17.     },
  18.    
  19.     name: function(){
  20.         hola = function(){
  21.             alert('hola '+this.nombre)
  22.         }.bind(this)
  23.        
  24.         hola();
  25.     }
  26. }
  27.  
  28.  
  29. mifuncion.algo();
  30. mifuncion.name();


Por mas que le doy vueltas no encuentro la explicacion de porque el ejemplo 1 no funciona y el 2 si, veo que es a un segundo nivel que funciona pero a primero no.....alguien que me de una buena explicacion, gracias:)
__________________
Juegos
Juegos iphone
  #2 (permalink)  
Antiguo 18/07/2010, 10:54
Avatar de 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: Duda con metodo Bind usado por frameworks

Código:
mifuncion ={
    algo: function(){
        this.nombre = 'carlos';
    },
    name: function(){
        alert('tu'+ this.algo)
    }.bind(this)
}
del primer ejemplo, el this de la linea #20 hace referencia al objeto global, o sea window. esto se debe al momento en que this es invocado. fijate que this no es parte del cuerpo de una función o método. en un objeto literal no se puede hacer referencia a si mismo mientras se esta creando el objeto. por eso cuando invocas name, this.algo no hace referencia al objeto mifuncion, sino al objeto que hayas pasado en bind, en este caso el objeto global. por tanto, mifuncion.name pasa a tener una función distinta a la que realmente se pretendia.

en el segundo ejemplo lo que cambia es que estas invocando el método bind luego que el objeto se crea y dentro de una función. en este caso, el this de la linea #22 -al estar dentro de una función- hace referencia al objeto mifuncion.

por otro lado no le veo sentido enlazar un metodo al mismo objeto que le contiene cuando deberia ser un objeto distinto.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Última edición por zerokilled; 07/08/2010 a las 10:13 Razón: error bbcode

Etiquetas: bind, metodo, framework
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:28.