同じ変数名を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の「再宣言してもエラーにならない」という緩さが意図しない上書きバグの温床だったことへの反省から、意図的に厳格化された設計です。ファイル全体を解析する段階で検出されるため、実行が始まる前に検出できます。