为什么这个JavaScript函数不会触发?

时间:2012-10-04 19:13:35

标签: javascript

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

永远不会被执行。为什么呢?

1 个答案:

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