我需要创建一个只能执行一次的函数,在第一次之后的每次都不会执行。我从 C++ 和 Java 知道可以完成这项工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?
原文由 vlio20 发布,翻译遵循 CC BY-SA 4.0 许可协议
我需要创建一个只能执行一次的函数,在第一次之后的每次都不会执行。我从 C++ 和 Java 知道可以完成这项工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?
原文由 vlio20 发布,翻译遵循 CC BY-SA 4.0 许可协议
将其替换为可重用的 NOOP (无操作) 函数。
// this function does nothing
function noop() {};
function foo() {
foo = noop; // swap the functions
// do your thing
}
function bar() {
bar = noop; // swap the functions
// do your thing
}
原文由 I Hate Lazy 发布,翻译遵循 CC BY-SA 3.0 许可协议
10 回答11.1k 阅读
6 回答3k 阅读
5 回答4.8k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
3 回答2.3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
如果“不会被执行”是指“多次调用时什么都不做”,则可以创建一个闭包:
回复@Vladloffe 的评论(现已删除):使用全局变量,其他代码可以重置“已执行”标志的值(无论您选择什么名称)。使用闭包,其他代码无法做到这一点,无论是无意的还是有意的。
正如这里的其他答案所指出的那样,几个库(例如 Underscore 和 Ramda )有一个小实用函数(通常命名为
once()
[*] ),它接受一个函数作为参数并返回另一个函数,该函数只调用一次提供的函数,不管返回的函数被调用多少次。返回的函数还缓存提供的函数首先返回的值,并在后续调用中返回该值。但是,如果您不使用这样的第三方库,但仍然想要一个实用函数(而不是我上面提供的 nonce 解决方案),那么它很容易实现。我见过的最好的版本是 David Walsh 发布的:
我倾向于改变
fn = null;
到fn = context = null;
.一旦fn
被调用,闭包就没有理由保持对context
的引用。用法:
[*]但是请注意,其他库,例如 这个 Drupal 对 jQuery 的扩展,可能有一个名为
once()
的函数,它的作用完全不同。