WebEngine

だらだらと綴る技術系メモ

strictモードで厳格なjavaScriptを書こう

strictモードとは?

近頃見られるようになった下記のような記述。javaScriptを書く際、必須になりつつあります。

(function() {
  'use strict';
  
  // 処理
})();


jsファイルの先頭に

'use strict'; 

と記述することにより、strictモードを 宣言することができます。strictモード下では、厳格なjavaScriptを書くことが求められるので、必然的に バグの混入を減らすことができます。

ちなみに

(function() {
})();

の部分は即時関数と呼ばれ、スコープ汚染を防ぐために用いられるものです。ここではテーマの範囲外になるので 割愛します。


効果

  1. 暗黙的なグローバル変数の禁止
  2. 代入不可なプロパティへの代入の禁止
  3. 削除できないプロパティの削除の禁止
  4. 関数の引数名の重複の禁止
  5. 幾つかの識別子は予約語にするため使用禁止(staticとか)
  6. 8進数表記の禁止
  7. eval 変数、arguments 変数の宣言禁止
  8. with 禁止

etc...って感じですね。
下の6、7、8はいいとして、1から5の効果は僕としては、かなり、ありがたいと思います。

代表効果の例

strictモードには、いくつかの効果がありますが、そのうちのもっとも基本的な効果がvar のつけ忘れを防げることです。上記の効果のうちの1.暗黙的なグローバル変数の禁止に当たる機能 です。

(function() {
  'use strict';
  var x = 'hello'; // ok
  y = 'goodnight'; // error
})();

コンソールで確認すればUncaught ReferenceError: y is not defined と注意されているはずです。ちょっとしたことですが、javaScriptは基本ゆるい言語 なので、こういうのが案外、助けになったりします。

注意点

  1. IE10以下ではサポートされていない
  2. 先頭以外でstrictを宣言しても strict モードにならない

1はそのままの意味です。Internet Explorerは昔からjavaScriptと 相性が悪いのです。

2は下記のコードを見てもらうのが早いです。

(function() {
  var x = 'hello';

  'use strict';
  y = 'goodnight'; // エラー吐かない

  // 両方の変数がコンソールに出力されてしまう!
  console.log(x);
  console.log(y);
})();

参考