javascript - JavaScript 中只能调用一次的函数

标签 javascript function design-patterns

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

最佳答案

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

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 解决方案),那么它很容易实现。我见过的最好的版本是 this one posted by 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

[*] 请注意,其他库,例如 this Drupal extension to jQuery ,可能有一个名为 once() 的函数,它做一些完全不同的事情。

关于javascript - JavaScript 中只能调用一次的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12713564/

相关文章:

java - 用于将请求最多的图像存储在 map 对象中的设计模式

javascript - this.props.history.push 在刷新后即可工作

javascript - 如何让我平滑滚动?

javascript - 在某些 slider 值处更新文本

javascript - 尝试使用 JS 在基于 Web 的系统上添加功能,但错误 404,找不到它

未在函数范围内声明的 Javascript 变量

java - fluffycat 示例中 Builder 加 Singleton 模式的困惑

javascript - json.stringify 没有在主对象下的所有对象上调用 toJson

python - 'print'在Python中的实现

api - API(如 Web API)基于什么设计模式(如果有)?