私は現在、ページ 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 = '';
}
}
}
}
}();
route 関数の switch 文で this.toggleView を呼び出してみると、「this」が Game.Router から window に変わっていることがわかりました。this.toggleView を Game.Router.toggleView に置き換えることで問題を解決できますが、これは理想的ではありません。
イベントリスナーを追加した後に「this」コンテキストが変更される理由を誰かが理解するのを手伝ってくれませんか?