JavaScript 中只能调用一次的函数
2022-08-30 04:11:37
我需要创建一个只能执行一次的函数,每次在第一次之后,它都不会被执行。我从C++和Java中了解到可以完成这项工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?
我需要创建一个只能执行一次的函数,每次在第一次之后,它都不会被执行。我从C++和Java中了解到可以完成这项工作的静态变量,但我想知道是否有更优雅的方法来做到这一点?
如果“不会被执行”的意思是“调用多次时将不执行任何操作”,则可以创建一个闭包:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
在回答@Vladloffe(现已删除)的注释时:使用全局变量,其他代码可以重置“executed”标志的值(无论您为其选择的任何名称)。使用闭包,其他代码无法做到这一点,无论是意外的还是故意的。
正如这里的其他答案所指出的那样,几个库(如Underscore和Ramda)有一个小的实用程序函数(通常命名为[*]),它接受一个函数作为参数,并返回另一个恰好调用所提供函数一次的函数,而不管返回的函数被调用多少次。返回的函数还会缓存由提供的函数首先返回的值,并在后续调用时返回该值。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;
context
fn
用法:
function something() { /* do something */ }
var one_something = once(something);
one_something(); // "do something" happens
one_something(); // nothing happens
[*]但请注意,其他库,例如jQuery的Drupal扩展,可能有一个名为once()
的函数,该函数执行完全不同的操作。
将其替换为可重用的 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
}