戻る

シャドーイング
グローバルスコープのシャドーイング

シャドーイングは、内側のスコープにある変数が外側のスコープにある同名の変数を隠すことをいいます。
コード内で定義した変数が親スコープにある同じ名前の変数を影のように隠し、
その変数(親スコープ側)にアクセスできないようにします。
そのため内側のスコープで宣言された変数が優先されます。

[サンプル]
copy
let tmp = 1;
function test()
{
	let tmp = 2;
	console.log(tmp);//2
}
test();
console.log(tmp);//1
このサンプルではtmp変数を対象としたシャドーイングとなっています。
let tmp = 1;
シャドーイングはtest関数内部のtmp変数です。この変数から見て外側のスコープ(グローバルスコープ)となります。

let tmp = 2;
シャドーイングとしてのtmp変数です。
シャドーイングは変数や関数が定義されているスコープに依存します。
同じ名前で内側のスコープの要素という条件から、外側のスコープの
同じ名前の要素を隠します。
この例では外側のスコープである「tmp=1」という変数を隠すため
内側のスコープが使用可能な状態のtmp変数となります。

console.log(tmp);
内側のスコープとは異なる条件であることから、
外側のスコープのtmp変数を使用した結果を出力します。

[条件]
letやconstキーワードで変数宣言された場合にシャドーイングが発生します。
varが関数スコープを持つため、ブロック内でvarを使用した同じ名前の変数を作成しても
シャドーイングは発生しません。
※同じ変数が参照されることになります。

[注意点]
変数名が同じになるとシャドーイングが発生する条件により
変数が意図しない結果の用途を招く恐れがあります。
コードの混乱を招き、バグの温床になる可能性があるためです。
このため、変数の名前を工夫するなどして
必要以外のシャドーイングを実装しないコーディングをする必要があります。



戻る


著作権情報
ホームページおよプリ等に掲載されている情報等については、いかなる保障もいたしません。
ホームページおよびアプリ等を通じて入手したいかなる情報も複製、販売、出版または使用させたり、
または公開したりすることはできません。
当方は、ホームペーよびアプリ利用したいかなる理由によっての障害等が発生しても、
その結果ホームページおよびアプリ等を利用された本人または他の第三者が被った損害について
一切の責任を負わないものとします。