2

我写了一个小哈希更改对象,它会在更改时提醒 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);

永远不会被处决。为什么?

4

1 回答 1

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尚未在浏览器中得到广泛支持。

于 2012-10-04T19:18:43.263 回答