为什么 Filatov 使用 OR 语句?

Why Did Filatov Use an OR Statement?

我已经对 Dmitry Filatov 的 jQuery-插件 (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 执行。是性能问题吗?

由于short-circuiting,逻辑运算符可以替代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 是 !#$%@$ 巫师。