2010-04-27 2 views
8

Ho il seguente codice. Mi aspettavo di vedere l'oggetto "archive" sulla mia console firebug, ma vedo oggetto Window. È normale?Javascript punta a Oggetto finestra

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
     callback(); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

risposta

6

oArchive.action.test2 si ottiene un riferimento a una funzione che callback poi punti, ma tale funzione è poi chiamata utilizzando callback(), il che significa che non viene richiamata come metodo e quindi this è l'oggetto globale. Il punto chiave è che this non è associato a una funzione: è determinato dal modo in cui viene chiamata la funzione.

In questo caso si potrebbe esplicitamente fare this punto l'oggetto dell'azione (ma non l'oggetto di archivio) utilizzando call o apply il metodo della funzione di callback:

test: function(callback) { 
    callback.call(this); 
}, 

per farlo this di essere l'oggetto di archivio invece, devi passare l'oggetto archivio in:

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback, archive){ 
     callback.call(archive); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2, oArchive);