12

JavaScript を 1 回だけ実行したいのですが、JavaScript ファイルを実行する回数を制御できません。基本的に、私は小さな JS スニペットを CMS に書き込んでおり、CMS は実際にそれを 5 ~ 10 回呼び出しています。したがって、次のようなソリューション:

function never_called_again(args) {
  // do some stuff
  never_called_again = function (new_args) {
   // do nothing
  }
}
never_called_again();

スニペットが最初から再度実行されるとすぐに関数が再宣言され、「何かを行う」が再評価されるため、機能していないようです。おそらく私はそれを適切に行っていないだけで、JSが得意ではありません。グローバル変数でtry-catchのようなものを使用することを検討しています

if (code_happened == undefined) {
    \\ run code
     code_happened = true;
}

編集: 一貫した状態があります。たとえば、変数を設定すると、スニペットが再度実行されたときに確認できます。しかし、アクセスする前に宣言する必要があるため、「この変数はまだ存在しますか」と言う方法がわかりません

4

4 に答える 4

28

これを試して:

var doneTheStuff;
function whatever() {
  if (!doneTheStuff) {
    doneTheStuff = true;
    // do the stuff
  }
}

冗長な変数宣言は、変数の値に影響しません。関数の 1 つが変数を に設定するtrueと、他の関数は何もしません。

于 2013-01-23T00:37:48.803 に答える
7
if (typeof code_happened === 'undefined') {
  window.code_happened = true;
  // Your code here.
}

このtypeofチェックにより、グローバルが宣言されていないという事実を回避できます。if (!window.code_happened)未定義のプロパティに対するプロパティ アクセスは禁止されていないため、そのまま実行することもできます。

于 2013-01-23T00:42:29.333 に答える
2

クロージャーを使用し、フラグを設定します。フラグが の場合はtrue、以下を返します。

if ( ! window.never_called_again  ) {
    window.never_called_again = (function () {
        var ran = false;
        return function (args) {
            if ( ran ) return;
            ran = true;
            // Do stuff
        };
    }());
}

これがフィドルです:http://jsfiddle.net/U2NCs/

于 2013-01-23T00:32:21.763 に答える