2012-03-08 9 views
6

外部変数から分離された外部関数の変数と同じ名前を持つ内部関数内で定義された変数はありますか?JavaScriptのクロージャと名前のクローバー

function() { 
    var myTest = "hi there"; 
    (function(myTest) { 
     myTest = "goodbye!"; 
    })(); 
    console.log(myTest); // myTest should still be "hi there" here, correct? 
} 

私は内側の関数内宣言myTestをしなかった場合は当然、それはクロージャを作成し、元を変更します。私は、内部関数内で宣言された変数が、その名前が外部スコープと競合する可能性がある場合でも、その関数に常に隔離されていることを確認したいだけです。

答えて

11

はい、効果的です。各関数は新しいスコープを作成し、要求された変数が常に宣言される最も近いスコープが優先されます。例外なく。*ただ、完全を期すため


*間接eval

+0

私はあなたが意味すると仮定し、「使用」することで、正しい「宣言」? – devios1

+0

@chaiguy:はい、申し訳ありません。そこに私の言葉を混ぜ合わせた。 – Ryan

+0

この方法では、スコープ検索も行われません。 –

1

。これら非常によく似たの例では、ここで同じ名前のパラメータ

var x = 'a'; 
(function() { //note that there is no parameter here 
    x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //b 

とVARと何が起こるかである

var x = 'a'; 
(function() { 
    var x = 'b'; 
    alert('inner:'+x); //b 
})(); 
alert('outer:'+x); //a 
関連する問題