web-dev-qa-db-ja.com

JavaScriptでの変数シャドウイングの例

Eloquent Javascript(第3章) で変数シャドーイングという用語について学びましたが、概念の正確で基本的な例を理解しようとしています。

これはシャドウイングの例ですか?

var currencySymbol = "$";

function showMoney(amount) {
  var currencySymbol = "€";
  document.write(currencySymbol + amount);
}

showMoney("100");​

これは、変数スコープとしても知られています。

変数は含まれる関数/メソッド/クラス内にのみ存在し、それらはより広いスコープに属する変数をオーバーライドします。

あなたの例では、ドルではなくユーロ記号が表示されるのはそのためです。 (ドルを含むcurrencySymbolは、ユーロ記号を含むcurrencySymbolよりも広い(グローバル)スコープにあるため)。

あなたの特定の質問に関して:はい、それは可変シャドウイングの良い例です。

27
Madara Uchiha

コンピュータープログラミングでは、特定のスコープ(決定ブロック、メソッド、または内部クラス)内で宣言された変数が外部スコープで宣言された変数と同じ名前を持つ場合、変数のシャドーイングが発生します。この外部変数はシャドウイングされていると言われています...

あなたの例は良いと思います。

内部メソッドと同じ名前を共有するグローバルに名前が付けられた変数があります。内部変数はその関数でのみ使用されます。その変数宣言のない他の関数はグローバルなものを使用します。

15
Eric Robinson

はい、あなたの例はシャドウイングの例です。

JavaScriptでクロージャーがどのように機能するかにより、シャドウイングは他のシナリオでも持続します。以下に例を示します。

var x = -1;
function xCounter() {
    var x = 0;
    return function() {
        ++x;
        return x;
    };
}

console.log(x);   // -1
counter = xCounter();
console.log(counter());   // 1
console.log(counter());   // 2
console.log(x);   // still -1, global was never touched

この場合、xCounterが返される場合でも、返される関数はそれ自体のxへの参照を保持し、その内部関数の呼び出しはグローバルに影響を与えないことに注意してください。スコープの。

8
Platinum Azure

変数を複数回定義することはできません。ただし、異なるスコープで定義できます。

let name="tara"
if(true){
  let name="ALi"
  if(true){
    console.log(name)
  }
}

変数のシャドーイングは、ローカルスコープの変数が親スコープの変数の代わりにその値を使用する場合です。したがって、ローカル変数の値は親をシャドーイングしています。

上記のコードには、2つの名前変数が定義されていますが、同じスコープで定義されていません。そのため、console.log(name)は、使用する名前変数を見つけた場合はローカルスコープをチェックし、見つからなかった場合は親スコープをチェックし、それを使用してルートに行かないようにします。

0
Yilmaz