问题描述
我已经分支了德米特里·菲拉托夫(Dmitry Filatov)的jQuery-Plugins(https://github.com/dfilatov/jquery-plugins),以了解这位@#^#$%的男人向导是如何编写节流阀和防反弹器的。
在对我完全没有意义的所有事情中,他的调节器将setTimeout()封装在IIFE中,作为OR语句的一部分:
// why the extra complexity here?
timer || (function() {
if (needInvoke) {
fn.apply(ctx,args);
needInvoke = false;
timer = setTimeout(arguments.callee,timeout);
} else {
timer = null;
}
})();
据我所知,如果计时器具有值,它只会阻止IIFE执行。这是性能问题吗?
解决方法
由于短路,逻辑运算符可以替代if
。
expr1 || expr2
等同于
if (!expr1) expr2
但是由于||
的参数必须是表达式,所以不能在此处放置语句块。 IIFE可用于在表达式中包装语句块。
如果撤消这些转换,则会得到更直接的代码:
if (!timer) {
if (needInvoke) {
fn.apply(ctx,args);
needInvoke = false;
timer = setTimeout(arguments.callee,timeout);
} else {
timer = null;
}
}
,
对于需要此功能的其他人,我找到了一个教程,可以使已弃用的被叫者陷入困境:https://programmingwithmosh.com/javascript/javascript-throttle-and-debounce-patterns/
我仍然认为Filatov是一个!#$%@ $向导。