2011-07-15 13 views

答えて

0

この:

var a = false; 

は... foo関数のスコープに対してローカルです。

この:

function bar(){ 
    alert(a); 
} 

... a = true変数のスコープで作成し、そのように、そのローカル変数環境を超えるので、その具体的なa変数の上に閉鎖されました。

ファンクションを作成するたびに、には、が作成された変数スコープが永続的に保持されます。

この関数を別の環境に渡すかどうかは関係ありません。常に元の変数環境のみを参照します。 fooにローカル変数を参照するためにbarためには

、あなたが引数としてbarにそれらを渡すことができます:

var test0 = 0; // global variable environment 

function a() { 

    var test1 = 1; // "a()" will always retain the global environment even if you 
        //  send "a()" somewhere else 

    function b() { 

     var test2 = 2; // "b()" will always retain the environment of "a()" and the 
         // global environment, even if you send "b()" somewhere else 
    } 
} 

EDIT

var a = true; 

function foo(callback){ 
    var a = false; 
    callback(a); 
} 

function bar(a){ 
    alert(a); 
} 
foo(bar); // now it alerts false 

例:http://jsfiddle.net/dSZ4M/

... bar()のパラメータには、グローバルaという変数と同じ名前が付けられています。関数のパラメータは、関数自身の変数環境外の変数の前に読み込まれるため、aパラメータは「シャドウ」グローバルa変数です。

このように、barからグローバルaを読み取ることはできません。もちろん、argなどのパラメータの名前を変更して、ローカルargパラメータとグローバルa変数の両方を参照できるようにするだけでよいでしょう。

+0

私が探していたものです。とにかく、fooのローカルスコープでコールバックを実行することはありますか? – user654616

+0

@ user654616:ようこそ。 – user113716

+0

@ user654616:そのスコープからbar *を実行できますが、呼び出すときに引数として渡さない限り、そのスコープ内の変数を参照することはできません。私は例を挙げて更新します: – user113716

3

あなたが新しいを作成a = falseを言うときあなたはvarを使用しているので、ローカルa、スコープ。

より広い範囲で既存の変数を変更する場合は、varを削除してください。

関連する問題