作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是一个函数:
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
引起一个匿名函数,该变量将 stop
在 false
的含义内。工作条件和 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/
我想模拟这个函数: function getMetaData(key) { var deferred = $q.defer(); var s3 = vm.ini
我是一名优秀的程序员,十分优秀!