2010-04-27 10 views
8

Ich habe den folgenden Code. Ich erwartete, "Archiv" -Objekt auf meiner Firebug-Konsole zu sehen, aber ich sehe Window-Objekt. Es ist normal?Javascript zeigt auf Window-Objekt

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); 

Antwort

6

oArchive.action.test2 bekommt man einen Verweis auf eine Funktion, die callback zeigt dann auf, aber diese Funktion aufgerufen wird dann callback() verwenden, was bedeutet, dass es nicht als eine Methode aufgerufen wird, und daher ist this das globale Objekt. Der entscheidende Punkt ist, dass this nicht an eine Funktion gebunden ist: Sie wird durch den Aufruf der Funktion bestimmt.

In diesem Fall explizit this Punkt zum Aktionsobjekt machen könnte (aber das Archivobjekt nicht) durch die Callback-Funktion des call oder apply Methode:

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

Um es this das Archiv-Objekt zu sein Stattdessen müssen Sie das Archivierungsobjekt übergeben:

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); 
Verwandte Themen