関数を呼ぶ位置を変更すると機能しないのはなぜですか?

関数の実行前に必要な変数が定義されていないためです。
2023年3月16日
ユーザー

お世話になっております。
showPassword() をスコープの終盤で呼び出す理由が理解できません。

showPassword() は「画面リロード時にデフォルトでパスワードを表示させる」
という目的を実現する為に記載するものだと認識しています。

コードにおける処理は上から順に行われる原則から考えると、
showPassword() はスコープの上部に記載されるべきだと考えました。

そこで、以下のように記載をしたところ、
画面リロード時にパスワードが表示されなくなってしまいました。

'use strict';
{
  function showPassword() {
    const lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";
    const numbers = "0123456789";
    const symbols = "!?><*+`}";
    let password = "";
    let lettersList = lowerCaseLetters + lowerCaseLetters.toUpperCase();

    if (numbersCheckbox.checked) {
      lettersList+= numbers;
    }

    if(symbolsCheckbox.checked) {
      lettersList+= symbols;
    }

    for (let i = 0; i < slider.value; i++) {
      password += lettersList[Math.floor(Math.random() * lettersList.length)];
    };

    result.textContent = password;
  }

  showPassword(); // ここだと表示されない

  const result = document.getElementById("result");
  const generatePassword = document.getElementById("generatePassword");
  const slider = document.getElementById("slider");
  const passwordLength = document.getElementById("password-length");
  const numbersCheckbox = document.getElementById("numbers-checkbox");
  const symbolsCheckbox = document.getElementById("symbols-checkbox");

  slider.addEventListener('input', () => {
    passwordLength.textContent = slider.value;
  });

  generatePassword.addEventListener("click", () => {
    showPassword();
  });

  showPassword(); // ここだと表示される
}

これはなぜなのでしょうか。

この回答を見るにはプレミアムサービスへの登録が必要です

プレミアムサービスとは?