为什么setInterval没有被clearInterval停止

时间:2016-08-05 13:25:59

标签: javascript jquery

var progressbar = {
    progress : null,
    html : function() {
        var loadingHtml = '<div id="loader-wrapper" class="catalog-loadmore">';
        loadingHtml += '<div class="progress"><div id="catalog-bar" class="progress-bar progress-bar-striped active" style="width: 10%"></div></div>';
        loadingHtml += '<div class=""><span id="progress-valuenow"></span>%</div>';
        loadingHtml += '</div>';
        return loadingHtml
    },
    start : function() {
        var width = 10;
        this.progress = setInterval(function() {
            $('#catalog-bar').css('width', width + '%');
            $('#progress-valuenow').text(width);
            if(width < 98){
                width += 1;
            }else{
                this.stop(); // this is not working
                clearInterval(this.progress); // this is also not working
                console.log('else')
            }
        }, 100);
    },
    stop : function() {
        clearInterval(this.progress);
    },
    destroy : function() {
        clearInterval(this.progress);
        $('#loader-wrapper').remove();

    }
}

在上面的代码中,为什么执行else条件的以下语句执行console.log('else')是打印但clearInterval()无法正常工作。我从外面调用progressbar.destroy()并且它正在工作。

this.stop(); // this is not working
clearInterval(this.progress); // this is also not working

任何人都可以告诉我,我做错了什么。

1 个答案:

答案 0 :(得分:1)

您已将匿名函数传递到setInterval,匿名函数将上下文this设置为window,因此您定位window.progress

您有两种方法可以解决您的问题:

  • this存储在某个变量中 var _this = this; setInterval(function() { ... clearInterval(_this.progress) } ...)

  • 使用Function.prototype.bind()设置匿名函数的上下文 setInterval(function() { ... clearInterval(this.progress) }.bind(this) ...)

或者为ES6设置转换器并使用Arrow function自动绑定this