2016-08-25 9 views
0

この関数は完全に独立して2回呼び出されるとします。したがって、2つの関数fn()に対してタイムアウトコールバックが作成され、両方の関数のクロージャにはcalledという変数があります。両方のクロージャで2回呼び出されるクロージャ内の変数の値は同じですか?

これは同じ変数か完全に独立した2つの変数ですか?どうして?

function createFunctionWithTimeout(callback, opt_timeout) { 
    var called = false; 
    function fn() { 
     if (!called) { 
      called = true; 
      callback(); 
     } 
    } 
    setTimeout(fn, opt_timeout || 5000); 
    return fn; 
} 

答えて

2

関数は、varで宣言された変数で終了します。関数createFunctionWithTimeoutが2回呼び出されると、各呼び出しが新しい変数を「作成」するため、シナリオ内のcalledは2つの完全に独立した変数になります。

返された関数(fn)を呼び出すと、called変数にもアクセスできます(ネストされた関数)。この場合、calledは独立していません。 createFunctionWithTimetout

0

への呼び出しによって作成されたクロージャに属します。すべての呼び出しでcreateFunctionWithTimeout内で宣言されたものがすべて作成されます。

これは機能スコープと呼ばれ、このように設計されています。

この記事を読み、JSのスコープについても見てください。ところで

http://www.w3schools.com/js/js_scope.asp

。変数calledを各呼び出しで同じにするには、グローバルにする必要があります。それは機能の外に置いてください。その場合、同じ変数を使用します。

これが役に立ちます。

0

新しい関数を呼び出すたびに、独自のスコープが作成され、このスコープ内のオブジェクトはこのスコープにのみ関連します。つまり、呼ばれる変数は2つの完全に独立した変数です。

関連する問題