Eloquent Javascript(第3章) で変数シャドーイングという用語について学びましたが、概念の正確で基本的な例を理解しようとしています。
これはシャドウイングの例ですか?
var currencySymbol = "$";
function showMoney(amount) {
var currencySymbol = "€";
document.write(currencySymbol + amount);
}
showMoney("100");
これは、変数スコープとしても知られています。
変数は含まれる関数/メソッド/クラス内にのみ存在し、それらはより広いスコープに属する変数をオーバーライドします。
あなたの例では、ドルではなくユーロ記号が表示されるのはそのためです。 (ドルを含むcurrencySymbol
は、ユーロ記号を含むcurrencySymbol
よりも広い(グローバル)スコープにあるため)。
あなたの特定の質問に関して:はい、それは可変シャドウイングの良い例です。
コンピュータープログラミングでは、特定のスコープ(決定ブロック、メソッド、または内部クラス)内で宣言された変数が外部スコープで宣言された変数と同じ名前を持つ場合、変数のシャドーイングが発生します。この外部変数はシャドウイングされていると言われています...
あなたの例は良いと思います。
内部メソッドと同じ名前を共有するグローバルに名前が付けられた変数があります。内部変数はその関数でのみ使用されます。その変数宣言のない他の関数はグローバルなものを使用します。
はい、あなたの例はシャドウイングの例です。
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
への参照を保持し、その内部関数の呼び出しはグローバルに影響を与えないことに注意してください。スコープの。
変数を複数回定義することはできません。ただし、異なるスコープで定義できます。
let name="tara"
if(true){
let name="ALi"
if(true){
console.log(name)
}
}
変数のシャドーイングは、ローカルスコープの変数が親スコープの変数の代わりにその値を使用する場合です。したがって、ローカル変数の値は親をシャドーイングしています。
上記のコードには、2つの名前変数が定義されていますが、同じスコープで定義されていません。そのため、console.log(name)は、使用する名前変数を見つけた場合はローカルスコープをチェックし、見つからなかった場合は親スコープをチェックし、それを使用してルートに行かないようにします。