JavaScriptのif-else構文における変数スコープのニュアンス
変数スコープには、いくつかのニュアンスがあります。
例を用いてそれを確認しましょう。
条件文の外側で変数resをある値で宣言し、
条件文の内側でその値を別の値に変更してみます:
let res = 1;
if (true) {
res = 2;
}
console.log(res); // 2を表示
ご覧の通り、変数resは条件文内で変更されました。
しかし、条件文内でletを使って
変数resを宣言すると、状況は一変します:
let res = 1;
if (true) {
let res = 2; // letで変数を宣言
}
console.log(res); // 2ではなく1を表示!
ここで重要なのは、条件文内でletを用いた変数宣言が、
ローカル変数resを作成したことです。
つまり、条件文の内側には一つの変数resが存在し、
外側には別の変数が存在するのです。
これは、条件文内で変数の値をコンソールに出力することで確認できます:
let res = 1;
if (true) {
let res = 2;
console.log(res); // 2を表示
}
console.log(res); // 1を表示
以下のコードの作者は、年齢が18歳に達しているかどうかを
確認しようとしました。しかし、このコードは年齢の値に関わらず、
コンソールにundefinedの値を出力します。
コード作者の誤りを修正してください。問題のコードは以下の通りです:
let age = 17;
let adult;
if (age >= 18) {
let adult = true;
} else {
let adult = false;
}
console.log(adult);
以下のコードの作者は、年齢が18歳に達しているかどうかを
確認しようとしました。コードを確認した結果、
年齢が18歳以上の場合、変数adultに
trueが代入される(正しい動作)ことがわかりました。
しかし、年齢が18歳未満の場合、
変数adultの値はundefinedになります。
コード作者の誤りを修正してください。
問題のコードは以下の通りです:
let age = 17;
let adult;
if (age >= 18) {
adult = true;
} else {
let adult = false;
}
console.log(adult);
以下のコードの作者は、年齢チェックを行おうとしました。
しかし、このコードは年齢の値に関わらず、
コンソールにundefinedの値を出力します。
コード作者の誤りを修正してください。
問題のコードは以下の通りです:
let age = 17;
let res;
if (age >= 18) {
if (age <= 23) {
let res = '18から23まで';
} else {
let res = '23より大きい';
}
} else {
let res = '18未満';
}
console.log(res);
以下のコードの作者は、年齢チェックを行おうとしました。
しかし、このコードは年齢が18歳より大きい場合、
コンソールにundefinedの値を出力します。
コード作者の誤りを修正してください。
問題のコードは以下の通りです:
let age = 19;
let res;
if (age >= 18) {
let res;
if (age <= 23) {
res = '18から23まで';
} else {
res = '23より大きい';
}
} else {
res = '18未満';
}
console.log(res);