JavaScript 中只能调用一次的函数

2022-08-30 04:11:37

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


答案 1

如果“不会被执行”的意思是“调用多次时将不执行任何操作”,则可以创建一个闭包:

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

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

在回答@Vladloffe(现已删除)的注释时:使用全局变量,其他代码可以重置“executed”标志的值(无论您为其选择的任何名称)。使用闭包,其他代码无法做到这一点,无论是意外的还是故意的。

正如这里的其他答案所指出的那样,几个库(如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;
    };
}

我倾向于更改为.没有理由让闭包保持对 once 已被调用的引用。fn = null;fn = context = null;contextfn

用法:

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

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

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


答案 2

将其替换为可重用的 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
}