2010-04-27 71 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);