Javascript 为什么节流阀将超时、上下文和参数设置为null?
所以我只是想理解substraint.js中throttle的代码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
_.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);