Code Fix

初級

同じ変数名を2回宣言したエラーの原因と直し方

同じスコープ内で同じ名前の変数をlet・constで2回宣言したときに出るエラーです。コピー&ペーストで既存の変数名とかぶってしまうケースが典型です。

エラーメッセージの読み方

main.js:2
main.js
ファイル名
2
行番号 — Node.jsが構文解析を諦めた位置
SyntaxError
エラークラス — 実行前の構文チェックで検出されました
Identifier 'name' has already been declared
内容 — 期待していたもの、または受け付けられなかったもの

このエラーが出る典型パターン

パターン1

 1  let name = "Al";
 2  let   name = "Bo";
      ^
 3  console.log(name);
main.js:2 let name = "Bo"; ^ SyntaxError: Identifier 'name' has already been declared

同じスコープでletを2回使うと再宣言エラーになります。値を更新したいだけなら再宣言せず代入だけにします。

直し方: let を (空) にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  let score = 0;
 2  let   score = 100;
      ^
 3  console.log(score);
main.js:2 let score = 100; ^ SyntaxError: Identifier 'score' has already been declared

scoreも同様です。2回目のletは新しい変数の宣言とみなされ、同じ名前が既にあるためエラーになります。

直し方: let を (空) にします。

この問題を解いてみる →

パターン3

 1  let index = 0;
 2  let   index = 1;
      ^
 3  console.log(index);
main.js:2 let index = 1; ^ SyntaxError: Identifier 'index' has already been declared

値を更新したいだけなら代入だけで十分です。let・constでの再宣言はスコープが同じである限り許されません。

直し方: let を (空) にします。

この問題を解いてみる →

パターン4

 1  let total = 0;
 2  const total = 5;
      ^
 3  console.log(total);
main.js:2 const total = 5; ^ SyntaxError: Identifier 'total' has already been declared

constで再宣言しようとしても同じくエラーです。値を更新したいだけならキーワードを付けずに代入します。

直し方: const を (空) にします。

この問題を解いてみる →

パターン5

 1  let flag = false;
 2  let   flag = true;
      ^
 3  console.log(flag);
main.js:2 let flag = true; ^ SyntaxError: Identifier 'flag' has already been declared

真偽値でも同様です。同じスコープでの再宣言は許されません。

直し方: let を (空) にします。

この問題を解いてみる →

よくある誤解

「同じ名前でも新しい値で上書きされるはず」という思い込みは、let・constでの再宣言には通用しません。値を更新したいだけなら再宣言せず、そのまま代入します。

実務での勘所

varで同じ名前を2回宣言しても、これはエラーにならず単に同じ変数として扱われます(2つ目のvar宣言は実質的に無視されます)。let・constがこれをSyntaxErrorとして拒否するのは、ECMAScript 2015でブロックスコープを導入した際、varの「再宣言してもエラーにならない」という緩さが意図しない上書きバグの温床だったことへの反省から、意図的に厳格化された設計です。ファイル全体を解析する段階で検出されるため、実行が始まる前に検出できます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)