我目前正在为我正在开发的游戏编写一个类,该类根据页面 URL 中的哈希更改控制应用程序路由。
我的问题是,在将主路由功能附加到 hashchange 事件后,“this”的上下文变为“window”。
这是到目前为止的代码:
Game.Router = function() {
return {
init: function() {
window.addEventListener('hashchange', this.route, false);
},
route: function(e) {
e.preventDefault();
var routingLocation = e.newURL.substr(e.newURL.indexOf('#!/') + 3, e.newURL.length);
switch(routingLocation) {
case "new":
this.toggleView('Game');
break;
case "instructions":
this.toggleView('Instructions');
break;
case "scores":
this.toggleView('Scores');
break;
case "about":
this.toggleView('About');
break;
}
},
toggleView: function(viewID) {
var els = document.querySelectorAll('section');
for(var i=0, l=els.length; i<l; i++) {
if(els[i].id == viewID) {
els[i].className = 'currentGameSection';
} else {
els[i].className = '';
}
}
}
}
}();
当我尝试在路由函数的 switch 语句中调用 this.toggleView 时,结果发现“this”已从 Game.Router 更改为 window。可以通过将 this.toggleView 替换为 Game.Router.toggleView 来解决问题,但这并不理想。
有人可以帮我理解为什么添加事件侦听器后“this”上下文会发生变化吗?