【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が見つからないエラーが出ます。

zyよりも先に宣言されていますが、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は、名前は同じですが別物です。

今回はx0であるため、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

となります。

scope thumb

役に立ったらシェアしよう!