JavaScriptのif-else構文における変数スコープのニュアンス

変数スコープには、いくつかのニュアンスがあります。 例を用いてそれを確認しましょう。 条件文の外側で変数resをある値で宣言し、 条件文の内側でその値を別の値に変更してみます:

javascriptlet res = 1;

if (true) {
  res = 2;
}

console.log(res); // 2を表示

ご覧の通り、変数resは条件文内で変更されました。 しかし、条件文内でletを使って 変数resを宣言すると、状況は一変します:

javascriptlet res = 1;

if (true) {
  let res = 2; // letで変数を宣言
}

console.log(res); // 2ではなく1を表示!

ここで重要なのは、条件文内でletを用いた変数宣言が、 ローカル変数resを作成したことです。

つまり、条件文の内側には一つの変数resが存在し、 外側には別の変数が存在するのです。 これは、条件文内で変数の値をコンソールに出力することで確認できます:

javascriptlet res = 1;

if (true) {
  let res = 2;
  console.log(res); // 2を表示
}

console.log(res); // 1を表示
Задание 1

以下のコードの作者は、年齢が18歳に達しているかどうかを 確認しようとしました。しかし、このコードは年齢の値に関わらず、 コンソールにundefinedの値を出力します。 コード作者の誤りを修正してください。問題のコードは以下の通りです:

javascriptlet age = 17;
let adult;

if (age >= 18) {
  let adult = true;
} else {
  let adult = false;
}

console.log(adult);
Задание 2

以下のコードの作者は、年齢が18歳に達しているかどうかを 確認しようとしました。コードを確認した結果、 年齢が18歳以上の場合、変数adultに trueが代入される(正しい動作)ことがわかりました。 しかし、年齢が18歳未満の場合、 変数adultの値はundefinedになります。 コード作者の誤りを修正してください。

問題のコードは以下の通りです:

javascriptlet age = 17;
let adult;

if (age >= 18) {
  adult = true;
} else {
  let adult = false;
}

console.log(adult);
Задание 3

以下のコードの作者は、年齢チェックを行おうとしました。 しかし、このコードは年齢の値に関わらず、 コンソールにundefinedの値を出力します。 コード作者の誤りを修正してください。

問題のコードは以下の通りです:

javascriptlet 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);
Задание 4

以下のコードの作者は、年齢チェックを行おうとしました。 しかし、このコードは年齢が18歳より大きい場合、 コンソールにundefinedの値を出力します。 コード作者の誤りを修正してください。

問題のコードは以下の通りです:

javascriptlet age = 19;
let res;

if (age >= 18) {
  let res;
  
  if (age <= 23) {
    res = '18から23まで';
  } else {
    res = '23より大きい';
  }
} else {
  res = '18未満';
}

console.log(res);