JavaScript

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

More than 2 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);