2013-01-23 4 views
7

私はJavaScriptを一度しか実行しません。しかし、 JavaScriptファイルが何回実行されるかを制御することはできません。基本的に私は小さなJSスニペットをCMSに書き、CMSは実際にそれを5〜10回呼びます。このようなソリューションので:JavaScriptを一度実行する

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; 
} 

EDIT:一貫性のある状態があります。変数を設定すると、スニペットが再び実行されたときに表示されます。しかし、私はそれにアクセスする前にそれを宣言しなければならない、私は 'この変数はまだ存在する'と言う方法を知らない。

+1

"私は 'この変数がまだ存在しない?' と言うのか分からない" - 通常、これは 'var foo = window.foo ||で行われます。 {} ' – zzzzBov

答えて

17

はこれを試してみてください:

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

冗長変数宣言は、変数の値には影響を与えません。いずれかの関数が変数をtrueに設定すると、他の関数は何もしません。

+0

作品!フォローアップの質問 - 最後に宣言された関数を実行しているようです。私には関係ありません(彼らはすべて同じですが)とにかく魅力的です。 – Hamy

+0

@Hamy - 私の解決策逆に働くだろう。最初に宣言された関数のみが実行されます。 –

+0

@Hamy同じ '

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/

+1

JavaScriptが2つの別々のビットで表示される場合、同じ問題が発生します。 – Pointy

+2

OPの説明を理解すると、関数の定義を含め、ファイル全体が複数回実行されています。これは本当の表現であり、複数回呼び出されます:http://jsfiddle.net/Qn52E/。 – mellamokb

+0

他の人が指摘しているように、私はmellamokbのコメントにもっと似ているので、これはうまくいきません;-) – Hamy

3
if (typeof code_happened === 'undefined') { 
    window.code_happened = true; 
    // Your code here. 
} 

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

関連する問題