使用'use strict';
しても、コードが突然改善されることはありません。
JavaScriptの厳密モードは、ECMAScript5の機能です。スクリプト/関数の先頭でこれを宣言することにより、厳密モードを有効にできます。
'use strict';
JavaScriptエンジンがこのディレクティブを認識すると、特別なモードでコードの解釈を開始します。このモードでは、潜在的なバグになる可能性のある特定のコーディング手法が検出されたときにエラーがスローされます(これが厳密モードの背後にある理由です)。
この例を考えてみましょう。
var a = 365;
var b = 030;
数値リテラルを並べるという彼らの執着の中で、開発者は誤って変数b
を8進数のリテラルで初期化しました。非厳密モードは、これを値24
(10進数)の数値リテラルとして解釈します。ただし、strictモードではエラーがスローされます。
厳密モードの専門分野の非網羅的なリストについては、この回答を参照してください。
どこで使えばいい'use strict';
ですか?
私の新しいJavaScriptアプリケーションでは:もちろんです!厳密モードは、コードで愚かなことをしているときに内部告発者として使用できます。
私の既存のJavaScriptコードでは:おそらくそうではありません!既存のJavaScriptコードに、strictモードで禁止されているステートメントが含まれている場合、アプリケーションは単純に機能しなくなります。厳密モードが必要な場合は、既存のコードをデバッグして修正する準備をしておく必要があります。これが、使用'use strict';
してもコードが突然改善されない理由です。
厳密モードを使用するにはどうすればよいですか?
'use strict';
スクリプトの上にステートメントを挿入します。
// File: myscript.js
'use strict';
var a = 2;
....
ファイル内のすべてがmyscript.js
厳密モードで解釈されることに注意してください。
または、'use strict';
関数本体の上にステートメントを挿入します。
function doSomething() {
'use strict';
...
}
関数の字句スコープ内のすべては、doSomething
厳密モードで解釈されます。ここでは、語彙スコープという単語が重要です。たとえば、strictコードがstrictではないライブラリの関数を呼び出す場合、呼び出された関数ではなく、コードのみがstrictモードで実行されます。より良い説明については、この回答を参照してください。
ストリクトモードで禁止されていることは何ですか?
厳密モードで禁止されているいくつかのことを説明する素晴らしい記事を見つけました(これは完全なリストではないことに注意してください)。
範囲
歴史的に、JavaScriptは関数のスコープ方法について混乱してきました。静的にスコープされているように見えることもありますが、一部の機能では、動的にスコープされているように動作します。これは混乱を招き、プログラムを読んだり理解したりするのを難しくします。誤解はバグを引き起こします。パフォーマンスの問題でもあります。静的スコープでは、コンパイル時に変数バインディングを実行できますが、動的スコープの要件により、バインディングを実行時に延期する必要があり、パフォーマンスが大幅に低下します。
厳密モードでは、すべての変数バインディングを静的に実行する必要があります。つまり、以前は動的バインディングが必要だった機能を削除または変更する必要があります。具体的には、withステートメントが削除され、eval関数が呼び出し元の環境を改ざんする機能が大幅に制限されます。
厳密なコードの利点の1つは、YUICompressorなどのツールがコードを処理
するときに優れた仕事をすることができることです。
暗黙のグローバル変数
JavaScriptはグローバル変数を暗示しています。変数を明示的に宣言しない場合、グローバル変数が暗黙的に宣言されます。これにより、初心者は基本的なハウスキーピングの雑用の一部を無視できるため、プログラミングが容易になります。ただし、大規模なプログラムの管理がはるかに困難になり、信頼性が大幅に低下します。したがって、厳密モードでは、暗黙のグローバル変数は作成されなくなります。すべての変数を明示的に宣言する必要があります。
グローバルリーク
this
グローバルオブジェクトにバインドされる可能性のある状況がいくつかあります。たとえばnew
、コンストラクター関数を呼び出すときにプレフィックスを指定し忘れた場合、コンストラクターthis
は予期せずにグローバルオブジェクトにバインドされるため、新しいオブジェクトを初期化する代わりに、グローバル変数をサイレントに改ざんします。このような状況では、代わりにstrictモードがにバインドthis
されますundefined
。これにより、コンストラクターは代わりに例外をスローし、エラーをより早く検出できるようになります。
騒々しい失敗
Object.createProperty
JavaScriptには常に読み取り専用のプロパティがありましたが、ES5の関数がその機能を公開するまで、JavaScriptを自分で作成することはできませんでした。読み取り専用プロパティに値を割り当てようとすると、サイレントに失敗します。割り当てによってプロパティの値が変更されることはありませんが、プログラムは変更されたかのように続行されます。これは完全性の危険であり、プログラムが一貫性のない状態になる可能性があります。厳密モードでは、読み取り専用プロパティを変更しようとすると、例外がスローされます。
オクタル
数値の8進数(または8進数)表現は、ワードサイズが3の倍数であるマシンでマシンレベルのプログラミングを行う場合に非常に役立ちました。ワードサイズが60ビットのCDC6600メインフレームで作業する場合は8進数が必要でした。8進数を読み取ることができれば、単語を20桁で見ることができます。2桁はオペコードを表し、1桁は8つのレジスタの1つを識別しました。機械語から高級言語への移行が遅い間、プログラミング言語で8進形式を提供することは有用であると考えられていました。
Cでは、非常に不幸なオクタルネスの表現が選択されました。先行ゼロ。したがって、Cでは、0100
100ではなく64を意味し08
、8ではなくエラーです。さらに残念なことに、この時代錯誤は、エラーの作成にのみ使用されるJavaScriptを含むほぼすべての現代言語にコピーされています。他の目的はありません。したがって、厳密モードでは、8進数形式は許可されなくなりました。
その他
引数の疑似配列は、ES5ではもう少し配列のようになります。callee
厳密モードでは、プロパティとプロパティが失われcaller
ます。これによりarguments
、多くの機密コンテキストを放棄することなく、信頼できないコードにあなたを渡すことが可能になります。また、
arguments
関数のプロパティが削除されます。
strictモードでは、関数リテラルのキーが重複すると構文エラーが発生します。関数は、同じ名前の2つのパラメーターを持つことはできません。関数は、そのパラメーターの1つと同じ名前の変数を持つことはできません。関数はdelete
それ自身の変数を持つことはできません。構成不可能なプロパティを試行すると
delete
、例外がスローされるようになりました。プリミティブ値は暗黙的にラップされません。
将来のJavaScriptバージョンの予約語
ECMAScript 5は、予約語のリストを追加します。それらを変数または引数として使用する場合、strictモードはエラーをスローします。予約語は次のとおりです。
implements
、、、、、、、、、、およびinterface
_ let
_ package
_ private
_ protected
_ public
_static
yield
参考文献