当我尝试使用“this”关键字访问对象时,我得到的是“window”对象而不是对象本身,因为我将它的函数绑定到一个事件而该事件属于window对象。
在示例中,alert(this.osd)
表示它未定义,因为“window”对象中没有“osd”。那么,解决这个问题的最佳方法是什么?将游戏对象定义为window.game?
var game = {
osd : null,
stage : null,
tick : function(){
alert(this.osd);
},
init : function(){
// Configure the OSD
this.osd = "a";
// Preapare the stage;
this.stage = "b";
window.addEventListener("click",this.tick);
}
}
game.init();
答案 0 :(得分:3)
您需要使用对象上下文调用tick方法,如下所示:
var self = this;
window.addEventListener("click", function() {self.tick()});
或者,您可以在现代浏览器中使用.bind()
,它基本上使用相同的东西(它创建一个使用正确的对象上下文调用实际方法的存根函数)。
window.addEventListener("click", this.tick.bind(this));
问题在于,当您将this.tick
传递给addEventListener()
时,您只是将函数引用传递给tick函数,而您实际上并未传递对象引用。因此,当addEventListener()调用tick而没有任何对象引用时,没有对象引用的函数调用的默认值this
是window
(当不处于严格模式时),这就是你所看到的
答案 1 :(得分:-1)
您可以使用闭包绑定,如下所示:
window.addEventListener('click',(function(o){return function(){o.tick()}})(this));
此外,(与您的问题无关),因为您正在创建初始化函数,所以最好使用类/实例设置:
function Game( myParameter ) {
this.osd = "a";
this.tick = function( ) {
}
window.addEventListener('click',(function(o){return function(){o.tick()}})(this));
}
var game = new Game( 3 );
请注意,game
现在使用new
创建,我们可以将参数传递给其“构造函数”函数。