2012-02-22 11 views
0

私はJavascriptの可変スコープで自分自身を見つけました。誰かが私に最初の例はうまくいかず、2番目の例はなぜそうなのか説明できますか?私は私のログに取得Javascriptの可変スコープで混乱しました

function test() { 
    return typeof(the_variable) !== 'undefined' && the_variable; 
} 

(function() { 
    var the_variable = "doesn't work"; 
    console.log(test()); 
}()); 

var the_variable = "does work"; 
console.log(test()); 

出力:

false 
does work 

また、私は

乾杯、デイブ、最初の例と同様に何かをする方法を知っていただきたいと思います。 、JavaScriptでは

function test() { 
    return typeof(the_variable) !== 'undefined' && the_variable; 
} 

// The variable in this function is scoped to the anonymous function. 
// It doesn't exist outside that function, so `test` cannot see it 
(function() { 
    var the_variable = "doesn't work"; 
    console.log(test()); 
}()); 

// This variable exists in a scope that wraps the `test` function, so it can see it. 
var the_variable = "does work"; 
console.log(test()); 

答えて

6

は、コメントで説明しました。あなたの最初の例ではthe_variabletestの範囲外です。一方、第2の例では、the_variableがグローバルスコープで定義されており、どこでも使用できます。

EDIT閉鎖中

キャッチthe_variableあなたはそれがtestに利用できるようにしたい場合。

var foo = (function() { 
    var the_variable = "does work"; 
    function test() { 
     return typeof(the_variable) !== 'undefined' && the_variable; 
    } 
    return {test : test}; 
}()); 
console.log(foo.test()); 

出力:

+0

動作しません。しかしテスト機能がなぜ匿名関数のスコープ内で物事を見るテストすることはできません匿名関数のスコープ内で呼ばれているのですか? – kzar

+0

さらに明示的に、スコープ内のどこにでも 'var foo'を置くことは、スコープ内の最初のアイテムとして置くことと全く同じです。 – gsnedders

+2

@kzarコールチェーンスコープではないので、それはレキシカルスコープです。 – gsnedders

0

を関数は、範囲を定義します。

+0

しかし、別の関数内から関数を呼び出すと、呼び出された関数のスコープにアクセスする関数が呼び出されないのはなぜですか? – kzar

+0

'function test()'は新しいスコープを開きます。囲む無名関数からの 'var'は利用できません。利用可能な場合はクロージャーの 'the_variable'をキャッチします。 –

+0

ああ、クールなアイデアですが、私はクロージャの中でtest()関数を定義することはできません、クロージャは実際に別のファイルで定義されています。 – kzar

関連する問題