我写了一个小的哈希更改对象,它会在更改时提醒url哈希:
(function() {
function hashChange() {
this.previousHash;
this.initialize();
}
hashChange.prototype.initialize = function() {
this.setInterval = window.setInterval(this.checkHashChange, 0);
}
hasChange.prototype.uponHashChange = function(hash) {
alert('I executed!');
var hashValue = hash.split('#')[1];
alert(hashValue);
}
hashChange.prototype.checkHashChange = function() {
var hash = window.location.hash;
if(hash && hash !== this.previousHash) {
this.previousHash = hash;
this.uponHashChange(hash); // <---- doesn't execute
}
}
var hashChange = new hashChange();
})();
但是这个:
this.uponHashChange(hash);
永远不会被执行。为什么呢?
答案 0 :(得分:5)
this.setInterval = window.setInterval(this.checkHashChange, 0);
这条线不会完全符合您的意思。 this.checkHashChange
将失去对当前this
(将是hashChange
实例)的绑定,而是在window
对象的上下文中调用。
您需要将其显式绑定到正确的上下文对象:
var self = this;
this.setInterval = window.setInterval(function() { self.checkHashChange() }, 0);
Matt Greer建议使用Function.bind
,这会使其更简洁,更具可读性:
this.setInterval = window.setInterval(checkHashChange.bind(this), 0);
不幸的是,Function.bind
尚未得到浏览器的广泛支持。