【Javascript】 スコープとブロック 理解度チェック
この内容のテキストはこちら
問1 変数が使える範囲
次のプログラムで、最初にエラーが起こる、またはプログラムが無限ループする場所はどこか答えてください。
let x = 0; if (x == 0) { x += 10; if (x != 10) { let z = 10; } else { let z = 0; } let y = x + z; if (y > 10) { console.log("yは10より大きい"); } }
答えはlet y = x + z;
で、z
が見つからないエラーが出ます。
z
がy
よりも先に宣言されていますが、z
のスコープはy
には届かず、波括弧でブロックが閉じられた時点でz
は使えなくなります。
問2 同じ変数名
次のプログラムの実行結果を予想してください
let x = 10; if (x == 10) { let y = 10; x += y; } else { let y = 50; x += y; } console.log(x);
y
が2回宣言されていますね。しかし、宣言場所を見ると、ブロックが異なる → 互いにスコープが分かれているということがわかります。
つまり、この2つのy
は、名前は同じですが別物です。
今回はx
が0
であるため、y = 10
された方だけが利用されるため、結果は
20
となります。
問3 同じ変数名その2
次のプログラムの実行結果を予想してください
for (let i = 0; i < 3; i++) { for (let i = 0; i < 2; i++) { console.log(i); } }
同じ変数名がある場合は、より狭いスコープの変数が優先されます。
そのため、外のforのi
と、内のforのi
は別物の変数です。内側のforにあるi++
は内側でlet i
したものが優先されるため、完全に別のループ用変数となります。
そのため、外側で3回、内側で2回ループするので、結果は
0 1 0 1 0 1
となります。
