Ver Mensaje Individual
  #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