function Router(){
this.routes = {};
this.currentUrl = '';
}
Router.prototype.route = function(path, callback){
this.routes[path] = callback || function(){};
}
Router.prototype.refresh = function(){
this.currentUrl = location.hash.slice('1') || '/';
this.routes[this.currentUrl]();
}
Router.prototype.init = function () {
window.addEventListener('load', this.refresh.bind(this), false);
window.addEventListener('hashchange', this.refresh.bind(this), false);
}
window.Router = new Router();
window.Router.init();
var content = document.querySelector('body');
// change Page anything
function changeBgColor(color) {
content.style.backgroundColor = color;
}
Router.route('/', function () {
changeBgColor('red')
})
Router.route('/blue', function () {
changeBgColor('blue')
})
Router.route('/green', function () {
changeBgColor('green')
})
问题就在于 window.addEventListener('load', this.refresh.bind(this), false);
这句话中 this.refresh.bind(this),弄晕了, 换成this.refresh.apply(this)和 call 都会报错, 有人能帮我来理清这个this指向的顺序吗?以及为什么不能使用 apply和call
this.refresh.apply(this)
是改变作用域并执行
this.refresh.bind(this)
是改变作用域并返回新函数(未执行)
这里的
this.refresh.bind(this)
是改变addEventListener
的this将其指向Router
,因为事件的this
指向事件的绑定者,这里是window