JavaScript 中只能调用一次的函数

新手上路,请多包涵

我需要创建一个只能执行一次的函数,在第一次之后的每次都不会执行。我从 C++ 和 Java 知道可以完成这项工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?

原文由 vlio20 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 915
2 个回答

如果“不会被执行”是指“多次调用时什么都不做”,则可以创建一个闭包:

 var something = (function() {
 var executed = false;
 return function() {
 if (!executed) {
 executed = true;
 // do something
 }
 };
 })();

 something(); // "do something" happens
 something(); // nothing happens

回复@Vladloffe 的评论(现已删除):使用全局变量,其他代码可以重置“已执行”标志的值(无论您选择什么名称)。使用闭包,其他代码无法做到这一点,无论是无意的还是有意的。

正如这里的其他答案所指出的那样,几个库(例如 UnderscoreRamda )有一个小实用函数(通常命名为 once()[*] ),它接受一个函数作为参数并返回另一个函数,该函数只调用一次提供的函数,不管返回的函数被调用多少次。返回的函数还缓存提供的函数首先返回的值,并在后续调用中返回该值。

但是,如果您不使用这样的第三方库,但仍然想要一个实用函数(而不是我上面提供的 nonce 解决方案),那么它很容易实现。我见过的最好的版本是 David Walsh 发布的

 function once(fn, context) {
 var result;
 return function() {
 if (fn) {
 result = fn.apply(context || this, arguments);
 fn = null;
 }
 return result;
 };
 }

我倾向于改变 fn = null;fn = context = null; .一旦 fn 被调用,闭包就没有理由保持对 context 的引用。

用法:

 function something() { /* do something */ }
 var one_something = once(something);

 one_something(); // "do something" happens
 one_something(); // nothing happens


[*]但是请注意,其他库,例如 这个 Drupal 对 jQuery 的扩展,可能有一个名为 once() 的函数,它的作用完全不同。

原文由 Ted Hopp 发布,翻译遵循 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 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题