Eloquent Javascript (Chapter 3)で変数シャドウイングという用語について学びましたが、概念の正確で基本的な例を理解しようとしています。
これはシャドーイングの例ですか?
var currencySymbol = "$";
function showMoney(amount) {
var currencySymbol = "€";
console.log(currencySymbol + amount);
}
showMoney("100");
Eloquent Javascript (Chapter 3)で変数シャドウイングという用語について学びましたが、概念の正確で基本的な例を理解しようとしています。
これはシャドーイングの例ですか?
var currencySymbol = "$";
function showMoney(amount) {
var currencySymbol = "€";
console.log(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 が返された場合でも、xCounter が返す関数はそれ自身への参照を保持しており、x
その内部関数の呼び出しは、元の関数がスコープ外になって久しいにもかかわらず、グローバルに影響を与えないことに注意してください。