Foros del Web » Programando para Internet » Javascript »

Problema con ambito de variabale this

Estas en el tema de Problema con ambito de variabale this en el foro de Javascript en Foros del Web. Hola gente del foro, tengo un problema con el ambito de la variable this, este es el script: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original ...
  #1 (permalink)  
Antiguo 14/07/2014, 12:35
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Problema con ambito de variabale this

Hola gente del foro, tengo un problema con el ambito de la variable this, este es el script:

Código Javascript:
Ver original
  1. // Censistas
  2. censista = function(db, callback) {
  3.     var self = this;
  4.     self.load(db, callback);
  5. }
  6. censista.prototype = {
  7.     "id_censista" : 0,
  8.     "nombre" : "",
  9.     "fecha_ultima_sincronizacion" : 0,
  10.     "results"     : [],
  11.     "callback"    : false,
  12.     "onError"     : function(err) {
  13.                         console.log(this);  // Esta linea hace el log del objeto
  14.                         if(this.callback)
  15.                             this.callback(this);               
  16.                     },
  17.     "load"        : function(db, callback) {
  18.                         var self = this;
  19.                         self.callback = callback;
  20.                                                 self.onError(); // Llamada 1 para debug
  21.                         db.transaction(function(tx) {
  22.                             tx.executeSql('SELECT id_censista, nombre, fecha_ultima_sincronizacion FROM censista;',
  23.                                             [],
  24.                                             function(tx, results) {
  25.                                                 self.results = [];
  26.                                                 self.id_censista = 0;
  27.                                                 self.nombre = "";
  28.                                                 self.fecha_ultima_sincronizacion = "";
  29.                                                 if(results.rows.length > 0)
  30.                                                 {
  31.                                                     for(var nro=0; nro < results.rows.length; nro++)
  32.                                                         self.results[results.rows.item(nro).id_censista] = {
  33.                                                             "nombre" : results.rows.item(nro).nombre,
  34.                                                             "fecha_ultima_sincronizacion" : results.rows.item(nro).fecha_ultima_sincronizacion
  35.                                                         };
  36.                                                     self.id_censista = results.rows.item(0).id_censista;
  37.                                                     self.nombre = results.rows.item(0).nombre;
  38.                                                     self.fecha_ultima_sincronizacion = results.rows.item(0).fecha_ultima_sincronizacion;
  39.                                                 }
  40.                                                 if(self.callback)
  41.                                                     self.callback(self);   
  42.                                             },
  43.                                             self.onError); // Llamada 2
  44.                         }, self.onError); // Llamada 2
  45.                     }
  46. }
Este script lo llamo con estas lineas:
Código Javascript:
Ver original
  1. db = window.openDatabase("censo", "1.0", "Censo", 1000000); // 10Mb.
  2. var thisCensista = new censista(db, function(tCen) {
  3.       alert("Llamada a callback");
  4. });

El problema lo tengo en el metodo onError, donde esta el log, la llamada 1 muestra en consola:
Cita:
censista {callback: function, id_censista: 0, nombre: "", fecha_ultima_sincronizacion: 0…}
y anda todo joya, pero cuando se ejecuta la llamada 2, la consola muestra esto:
Cita:
Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}
Es decir, que la variable this, al ser llamada de forma directa, tiene el valor del objeto (¿?) censista pero al ser llamada como callback en caso de error, adopta el valor de window.

Como puedo hacer para arreglar esto?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 14/07/2014 a las 13:01
  #2 (permalink)  
Antiguo 15/07/2014, 20:28
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: Problema con ambito de variabale this

buenas,
es muy probable que la función transaction o executeSql está invocando el callback onerror en otro contexto. o sea, esta asignando onerror a otro objeto de modo que el valor de this cambia. en ese caso, intenta crear el método onerror dentro de load y utiliza la variable self en lugar de this.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.

Etiquetas: ambito, select, valor, variable
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 19:09.