1. ホーム
  2. javascript

[解決済み] JavaScriptの一度だけ呼び出すことのできる関数

2022-06-17 11:48:02

質問

一度だけ実行できる関数を作りたいのですが、一度目以降は実行されません。私は仕事をすることができる静的変数についてC + +とJavaから知っているが、私はこれを行うには、よりエレガントな方法があるかどうかを知りたいのですか?

どのように解決するのですか?

実行されない」というのが「複数回呼び出されても何もしない」という意味であれば、クロージャを作成すればよいでしょう。

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

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

Vladloffe (現在は削除済み) によるコメントへの回答です。グローバル変数では、他のコードは "実行済み" フラグ (どのような名前を選んでも) の値をリセットすることができます。クロージャを使用すると、他のコードでは、偶然であれ故意であれ、それを行う方法がありません。

ここでの他の回答が指摘するように、いくつかのライブラリ (たとえば アンダースコア ラムダ ) には、小さなユーティリティ関数 (通常 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; . への参照をクロージャが保持する理由はありません。 context 一度 fn が呼び出されます。

使用方法です。

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

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


[*] しかし、他のライブラリ、例えば この jQuery の Drupal 拡張は という名前の関数を持っている場合があります。 once() という名前の関数があり、それが全く異なることを行うかもしれません。