gpt4 book ai didi

javascript - 难以理解的work装饰器函数

转载 作者:行者123 更新时间:2023-11-30 17:05:48 25 4
gpt4 key购买 nike

是一个函数:

var f = function(a) { console.log(a) };

function throttle(func, ms) {
var stop = false, savedThis, savedArgs;

return function wrapper() {
if(stop) {
savedArgs = arguments;
savedThis = this;
return;
}

func.apply(this, arguments)
stop = true;

setTimeout(function() {
stop = false;
if(savedArgs) {
wrapper.apply(savedThis, savedArgs);
savedArgs = savedThis = null;
}
}, ms);
};
}

// brake function to once every 1000 ms
var f1000 = throttle(f, 1000);

f1000(1); // print 1
f1000(2); // (brakes, less than 1000ms)
f1000(3); // (brakes, less than 1000ms)

第一次调用f1000(1)显示1.f1000(2),第二次调用不起作用,但会一直保存在savedAggs 链接到第二次调用的参数。第三次启动也不起作用,但它会覆盖指向第三次调用参数的链接。通过 1000 ms setTimeout 引起一个匿名函数,该变量将 stopfalse 的含义内。工作条件和 wrapper 将被递归调用。但后来我不明白发生了什么事?当此代码有效时:savedArgs = savedThis = null;?

最佳答案

功能有点看不懂,是的。它的工作是将调用速率限制为最多每 1000 毫秒一次 - 但是,如果调用频率更高,它还会在超时结束后立即重复上一次调用。

最好写成

function throttle(func, ms) {
var stop = false, savedThis, savedArgs;
function invoke() {
stop = true; // the last invocation will have been less than `ms` ago
func.apply(savedThis, savedArgs);
savedThis = savedArgs = null;
setTimeout(function() {
stop = false; // the timeout is over, start accepting new invocations
if (savedArgs) // there has been at least one invocation during
// the current timeout
invoke(); // let's repeat that
}, ms);
}
return function wrapper() {
savedArgs = arguments;
savedThis = this;

if (stop)
return;
else
invoke();
};
}

关于javascript - 难以理解的work装饰器函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28070033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com