为什么 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 是 !#$%@$ 巫师。
我已经对 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 是 !#$%@$ 巫师。