2017-06-15 11 views
0

私はJavascriptを学んでいて、この質問がありました。ここではいくつかのサンプルコードがあります:JavaScript:ネストされた関数の中間/外部関数の変数/プロパティへのアクセス

出力を見てみると

var xq = false; 
 
var fooyy = function ttt() { 
 
    var xq = false; 
 
    baryy = function() { 
 
    var xq = true; 
 
    console.log(xq); 
 
    console.log(ttt); 
 
    console.log(fooyy); 
 
    console.log(ttt.xq); 
 
    console.log(fooyy.xq); 
 
    console.log(window.xq); 
 
    }(); 
 
}; 
 

 
fooyy(); 
 
console.log(xq); 
 
console.log(fooyy.xq);

、私の質問は、それは(外側の関数の内部にネストした関数から、プロパティや変数にアクセスできないことを意味しています同じ名前を持つ場合とそうでない場合の両方)そうであれば、どうやって説明することができますか? (私は、ローカル変数とグローバル変数がアクセス可能であることがわかります)ありがとう!

+3

[Closures](https://developer.mozilla.org/en/docs/Web/JavaScript/Closures)を参照してください。 – James

答えて

1

これは、内部ネストされた関数から、外部関数のプロパティと変数にアクセスできないことを意味しますか?

いいえ。これらはプロパティではなく、変数です。存在しない関数のプロパティとしてアクセスしようとしました。

ローカル変数とグローバル変数にアクセスできることがわかります。外部関数の変数(同じ名前を持つ場合とそうでない場合の両方)はどうでしょうか?

名前が異なる限り、アクセスできます。これはlexical scopeと呼ばれ、外側の関数が返された後でも機能します。内側の関数はclosureとなります。あなたはそれらの名前で簡単にアクセスできます。それらはローカル変数です。

あなたはしかし、ローカル変数が外側のスコープから変数をシャドウし、それがアクセスできなくなることを、あなたの例では、変数xqのように、あなたのローカルスコープ内に同じ名前の変数を持っていない場合。それにアクセスするには、いずれかの変数の名前を変更する必要があります。

0

closureは、SO questionでうまく説明されています。

また、SO questionをご覧ください。人々は、クロージャが何であるかを説明するために多くの努力をしました。

つまり、baryy関数は外部変数にアクセスできます。

関連する問題