Edited at

constを非strictモードで使ってはいけない3つの理由

More than 3 years have passed since last update.

追記:3つ→ただ1つ(mysticateaさん、ご指摘ありがとうございます)


  1. 非strictの挙動はES6ではバグ。将来、修正されるので今は非strictモードでは使うべきではない


constは必ずstrictモードで使うべきである。

そもそもモダンJSにおいて非strictモード自体が非推奨であるのだが、constに関しては非strictモードにおいて以下の3つの大きな問題があるため、特におすすめできない。


  1. 再代入してもエラーにならない

  2. 関数スコープである

  3. 宣言の巻き上げが発生する


1. 再代入してもエラーにならない

エラーにならず元の値のまま。バグの原因になる。

const x = 1;

x = 2;
console.log(x); // 1のまま変わらない

strictモードではエラーになる

'use strict';

const x = 1;
x = 2; // TypeError: Assignment to constant variable.
console.log(x);


2. 関数スコープである

関数スコープはJSの負の遺産である。varよりletを使うべき理由と同じ。

if (true) {

const x = 1;
}
console.log(x); // 1

if (false) {
const y = 2;
}
console.log(y); // undefined

strictモードではブロックスコープになる。

'use strict';

if (true) {
const z = 3;
}
console.log(z); // ReferenceError: x is not defined


3. 宣言の巻き上げが発生する

巻き上げもJSの負の遺産でありvarよりletを使うべき理由と同じだが、constの巻き上げには特に重大な問題がある。

console.log(x);   // undefined

const x = 1; //
console.log(x); // 1

宣言の前後で値が代わる、これは事実上の再代入である。

strictモードでは巻き上げが発生しないのでこの問題は発生しない。

'use strict';

console.log(x); // ReferenceError: x is not defined
const x = 1;
console.log(x);