2011-02-04 11 views
0

Thisは私がこれを行うためのいくつかの方法が必要とわずかに異なる何かが実際にある必要なものをとにかくthis保管トラック、パート2

に関連していますこのコードは、call()またはapply()で呼び出された場合にはthisの場合でもこのコードが機能することを確認したいだけです。

チェックアウトthis最初のものはすべてコンテキストに関係なく真でなければなりません

+0

Doesnt my [answerここに](http://stackoverflow.com/questions/4893656/how-can-i-keep-track-of-multiple-runs-of-the-same-function/4893989#4893989)あなたの他の質問でこれを扱う? –

+0

元の質問に全く同じ解決策が含まれているので、私の回答を削除しました。 – Anurag

答えて

1

クロージャの完全な使用を得るために、私はあなたがフラグを「実行」を開始、別の関数の中で、あなたの主な機能をラップ勧め:

function initRun(){ 
    var ran = ran || false; 
    return function(arguments){ 
     if(ran) 
      { 
       console.log("can't run any more!"); 
       return; 
      } 
     ran = true; 
     console.log("i'm running!"); 
     /* your logic here */ 
    } 
} 
var run = initRun(); 

、あなたは何にあなたの関数を呼び出すことによって、それをテストすることができますが

run(); 
run.call(); 
run.apply(); 

使用する呼び出し方法に関係なく、1回だけ正常に実行されます。
あなたの最初の「実行」機能をラップする特別な機能が必要ですが、機能呼び出しを追跡するグローバルフラグを使用するよりも信頼性が高くエレガントだと思います。

0

"this"を "arguments.callee"に置き換えることができます。 arguments.calleeは、現在の関数を表すオブジェクトを常に提供して、 "this"を変更しないようにしなければなりません。 (しかし、私は^^を試しませんでした)

+0

新しいEMCAスクリプトから 'arguments.callee'が削除されます。私は現在滞在する何かを探しています – qwertymk

+0

@qwertymk:あなたは引用がありますか?これは、https://developer.mozilla.org/ja/JavaScript/Reference/Functions_and_function_scope/arguments/calleeの記述です:JavaScript 1.4:Function.argumentsのプロパティとして非推奨の呼び出し先です。*関数のローカル引数のプロパティとして保持されています変数*。 – yankee

0

自立型関数を定義するとき、 "this"はグローバルウィンドウオブジェクトを参照します。その場合、大域変数を明示的に使用するだけで、 "this"が.apply()または.call()...から取り除かれることを避けることができます。

function run(arg) { 
    window.ran = window.ran || false; 
    if (!window.ran) init(); 
    /* code */ 
    window.ran = true; 
} 

「オブジェクト」のプロパティとして関数を定義すると、「this」は所有オブジェクトを指します。 「this」は関数の所有者への参照であり、所有者はコンテキストに依存することに注意してください。

編集:また、@ Anuragの提案のフォローアップとして、これは不適切ですか?

var run = (function createRun() { 
    var ran = false; 
    return function(arg) { 
     if (!ran) init; 
     // code 
     ran = true; 
    }; 
})(); 

run(arg); 
関連する問題