2010-04-27 87 views
8

我有以下代碼。我希望在我的Firebug控制檯上看到「存檔」對象,但我看到了Window對象。這是正常的嗎?Javascript this this to Window對象

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

回答

6

oArchive.action.test2讓你到一個函數,然後callback指向一個參考,但隨後即函數是使用callback()調用,這意味着它不叫爲方法,並因此this是全局對象。關鍵是this沒有綁定到一個函數:它由函數的調用方式決定。

在這種情況下,你可以明確地使用回調函數的callapply方法使this點操作的對象(而不是歸檔對象):

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

爲了得到它this是歸檔對象相反,您需要傳遞存檔對象:

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