Javascript 为什么节流阀将超时、上下文和参数设置为null?

Javascript 为什么节流阀将超时、上下文和参数设置为null?,javascript,underscore.js,Javascript,Underscore.js,所以我只是想理解substraint.js中throttle的代码 _.throttle = function(func, wait, options) { var context, args, result; var timeout = null; var previous = 0; options || (options = {}); var later = function() { previous = options.leading

所以我只是想理解substraint.js中throttle的代码

_.throttle = function(func, wait, options) {
    var context, args, result;
    var timeout = null;
    var previous = 0;
    options || (options = {});
    var later = function() {
        previous = options.leading === false ? 0 : _.now();
        timeout = null;
        result = func.apply(context, args);
        context = args = null;
    };
    return function() {
        var now = _.now();
        if (!previous && options.leading === false) previous = now;
        var remaining = wait - (now - previous);
        context = this;
        args = arguments;
        if (remaining <= 0) {
            clearTimeout(timeout);
            timeout = null;
            previous = now;
            result = func.apply(context, args);
            context = args = null;
        } else if (!timeout && options.trailing !== false) {
            timeout = setTimeout(later, remaining);
        }
        return result;
    };
};
\节流阀=功能(func、等待、选项){
变量上下文、参数、结果;
var超时=null;
var-previous=0;
选项| |(选项={});
var later=function(){
previous=options.leading==false?0:wk.now();
超时=空;
结果=函数应用(上下文,参数);
上下文=args=null;
};
返回函数(){
var now=uz.now();
如果(!previous&&options.leading==false)previous=now;
var剩余=等待-(现在-以前);
上下文=这个;
args=参数;

如果(剩余我认为这与防止内存泄漏有关,正如您已经指出的那样。

让我们假设您创建了大量节流函数,使用大量数据调用它们,然后再也不调用它们。然后由
\uU9.throttle
创建的函数仍然会在闭包范围内保留对该数据的引用。理论上,返回的函数仍然可以访问这些函数,因此GC将无法清理只要不处理受限制的函数,就可以更新这些数据。因此,将这些变量设置为null可确保没有保留的引用不再使用,从而防止内存泄漏。

在由
创建的函数创建后,无法访问这些引用。
受限制的函数的作用域是GC'd,但如果是GC'd,则可能永远不会发生这种情况cope或其内部作用域包含一个
eval
调用,如果其作用域是全局作用域,则永远不会发生调用。但是由
\uuu.throttle
创建的函数可能永远不会被GC'd,因为它们一直被保留着。也许你有数千个对象知道如何更新自己,而update函数也会被限制你有这些东西在周围,并不意味着你想保持上下文,args等从上次调用周围。
var dummyFunc1 = function(testStr) {
  console.log("HELLO");
};

var dummyFunc2 = function(testStr) {
  console.log("BOOM");
}

var dummyFunc3 = function(testStr) {
  console.log("STOOP");
}

var testStr = '';
for (var i = 0; i < 1000000; i++){
  testStr += i;
}

var largeThrottled1 = _.throttle(dummyFunc1, 1000);
var largeThrottled2 = _.throttle(dummyFunc2, 1000);
var largeThrottled3 = _.throttle(dummyFunc3,1000);

largeThrottled1(testStr);
largeThrottled1(testStr);