Javascript setTimeOut导致泄漏

时间:2017-07-06 14:55:34

标签: javascript jquery timer widget settimeout

在chrome profiler中分析我的页面时引起了我的注意,我注意到了一些奇怪的东西。节点数量确实增加了。 当禁用大部分页面时,我最终得到了一个计时器功能。

计时器是一个jquery小部件,它使用函数setTimeOut()。在连续循环中触发并由分析器检测到的行:

this._id = setTimeout($.proxy(this._callback, this) , this.options.delay);

计时器代码的其他部分:

$(function() {
    $.widget('timer', {
        options: {
            delay: 1000,
            repeat: false,
            autostart: true
        },

        _timerId: null,
        _id: null,
        _index: null,
        _state: 0,

        /**
         * The constructor
         *
         * @private
         */
        _create: function() {
            if (this.options.autostart) {
                this._state = 1;
                this._id = setTimeout($.proxy(this._callback, this), this.options.delay);
            }
        },

        _callback: function()
        {
            if (typeof this.options.callback == 'function') {
                $.proxy(this.options.callback, this.element).call(this, ++this._index);
            }

            if (this.options.repeat && this._state == 1 && (typeof this.options.repeat == "boolean" || parseInt(this.options.repeat) > this._index)) {
                this._id = setTimeout($.proxy(this._callback, this) , this.options.delay);
            } else {
                this._timerId = null;
            }
        },

探查器的屏幕截图:

profiler result

分析器确实运行了405秒,因为您可以看到两个节点都在增加。并且即使在节点仍在增加的几个小时之后,垃圾收集器也不会收集它,30分钟它已经超过25K节点并且监听器是稳定的。

我的想法是我使用widget结构和setTimeOut函数的组合,但我没有找到任何有用的主题。

这是由代码引起的,这是由分析器引起的吗?

0 个答案:

没有答案