JavaScript/strictモード
Strict モードは、通常はエラーとはせず見逃していたプログラミング上の省略をエラーにするなど、より厳格に振る舞うモードです。 Strict モードは、ECMAScript 2009 = ES5 で導入されました[1]。
概要
編集Strict モードはスクリプト全体あるいは、個別の関数に適用できます(var 宣言された変数のスコープと似ていますね)。
スクリプト全体をStrict モードにする場合
'use strict';
var msg = "Hello strict world!";
console.log(msg);
この例では怪しい兆候がないので、Hello strict world! が表示されました。
'use strict';
msg = "Hello strict world!";
console.log(msg);
1箇所変更しました。
実行すると、ReferenceError: msg is not defined となります。
var
を省略したので、(初期化を伴う)変数宣言から代入になり「define している場所がない」状況がエラーになっています。
'use strict';
をとってみます。
msg = "Hello strict world!";
console.log(msg);
Hello strict world! が表示されました。
関数単位でStrict モードにする場合
console.log(0)
function nostrict() {
msg = "Hello nostrict function!";
console.log(msg + 0177);
}
console.log(1)
function strict() {
'use strict';
msg = "Hello strict function!";
console.log(msg + 0177);
}
console.log(2)
// SyntaxError: Octal literals are not allowed in strict mode.
console.log() による表示は全く行われないでエラーで止まります。 0に[0-7]が続く書式の八進数表現はstrictモードではエラーです。
class 定義は自動的に strict モード
編集ES6で導入されたクラス(class)の定義の中では、自動的にstrict モードになります。
strict モードのエラー対象
編集この節は書きかけです。この節を編集してくれる方を心からお待ちしています。
- 未宣言のグローバル変数への代入
- 0に[0-7]が続く書式の八進数表現
- with文
- NaNへの代入
- implements, interface, let, package, private, protected, public, static, yield を予約語扱いにします(ES5当時、その後正規の予約語になったものも)
脚註
編集- ^ 初見: https://www.ecma-international.org/wp-content/uploads/ECMA-262_5th_edition_december_2009.pdf#page=61 10.1.1 Strict Mode Code、現行: https://262.ecma-international.org/#sec-strict-mode-of-ecmascript C The Strict Mode of ECMAScript