[解決済み] JavaScriptの一度だけ呼び出すことのできる関数
質問
一度だけ実行できる関数を作りたいのですが、一度目以降は実行されません。私は仕事をすることができる静的変数について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()
という名前の関数があり、それが全く異なることを行うかもしれません。
関連
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み] event.preventDefault() vs. return false
-
[解決済み] JavaScriptで文字列をbooleanに変換するにはどうしたらいいですか?
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] JavaScriptでカンマを桁区切りにして数値を表示する方法
-
[解決済み] オブジェクトの配列から、プロパティの値を配列として取り出す。
-
[解決済み】JavaScriptの関数にデフォルトのパラメータ値を設定する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
JavaScriptにおけるマクロタスクとミクロタスクの詳細
-
Vueの「データを聴く」原則を解説
-
[解決済み】最大呼び出しスタックサイズ超過エラー
-
[解決済み] Error : 未定義のプロパティ 'map' を読み取ることができません。
-
[解決済み】Node.js getaddrinfo ENOTFOUND
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】React - TypeError: 未定義のプロパティ 'props' を読み取ることができない。
-
[解決済み】エラー。Ionic使用中にモジュール '../lib/utils/unsupported.js' が見つかりませんでした。
-
[解決済み】「.addEventListener is not a function」なぜこのエラーが発生するのか?
-
jq は html ページとデータを動的に分割する。