【发布时间】:2021-02-09 01:21:22
【问题描述】:
我已经对 Dmitry Filatov 的 jQuery-Plugins (https://github.com/dfilatov/jquery-plugins) 进行了分支,以努力了解这个 @#^#$% 男巫如何编写他的油门和去抖动包装器。
在所有对我来说完全没有意义的事情中,他的油门将 setTimeout() 作为 OR 语句的一部分包装在 IIFE 中:
// why the extra complexity here?
timer || (function() {
if (needInvoke) {
fn.apply(ctx, args);
needInvoke = false;
timer = setTimeout(arguments.callee, timeout);
} else {
timer = null;
}
})();
据我所知,如果计时器有值,它只会阻止 IIFE 执行。是性能问题吗?
【问题讨论】:
-
这是为了防止多个定时器运行。此外,该代码非常陈旧;
arguments.callee不应该在现代代码中使用。 -
请注意存储库自述文件顶部的警告。
-
这里没有什么非常“神奇”的地方,尽管如果你不熟悉这样的 JavaScript 约定,它可能看起来很神奇。老实说,其中很多只是由于 JavaScript 早期(例如 ES5 之前)版本的限制而造成的语法垃圾。不要被这样的东西弄得眼花缭乱。
-
这是
if (!timer) { if (needInvoke) ... else ... }的快捷方式 -
我同意 tadman,因为它不是进行外部检查 if (!inThrottle) {....}
标签: javascript throttling iife