ECMAScript5で導入された厳格なパターンにより、開発者は、開発プロセスで最も一般的で困難なエラーを検出するのが最も一般的で困難な環境のいくつかに対処できるようにすることにより、開発者が「より良い」JavaScript言語を持つことができます。長い間、Firefoxのみが厳格モードをサポートするため、Strictモードについて疑問がありました。しかし、今日、すべての主流ブラウザは、最新のバージョン(IE10、Opera12、Android 4、iOS5を含む)の厳格モードをサポートしています。厳密なモードの使用を開始する時が来ました。
モデルの厳格な役割はどのような役割を果たすことができますか?
厳格なパターンはJavaScriptに多くの変更をもたらし、それらを2つのカテゴリ(明らかで微妙)に分割しました。マイナーな改善の目標は、現在のJavaScriptのいくつかの詳細な問題を修正することですが、ここでは詳細に説明しません。興味のある方は、Dmitry Soshnikov ECMA-262-5が書いた素晴らしいドキュメントを詳細に読んでください。主に、厳密なモードによって導入された明らかな変更、Strictモードを使用する前に知っておくべき概念、および最も役立つ変更を紹介します。
特定の機能の学習を開始する前に、厳格モードの主要な目標の1つは、より速く、より便利にデバッグできるようにすることであることを忘れないでください。ランタイム環境が黙って失敗したり、奇妙に行動するよりも問題を発見したときに明示的なエラーを投げる方が良いです(これは、StrictモードをオンにしないJavaScriptを実行している環境の場合です)。厳密なモードはより多くのエラーをスローしますが、これらのエラーはあなたの注意を引き、以前は見つけるのが難しい多くの潜在的な問題を修正するので、それは良いことです。
キーワードで削除します
最初に、withステートメントは厳密なモードで削除され、withステートメントを含むコードは厳密なモードで例外をスローします。したがって、Strictモードを使用するための最初のステップ:コードで使用しないことを確認してください。
コードコピーは次のとおりです。
//次のJavaScriptコードは、厳密なモードでエラーをスローします
with(場所){
アラート(href);
}
予期せずに値をグローバル変数に割り当てるのを防ぎます
第二に、割り当て前にローカル変数を宣言する必要があります。 Strictモードが有効になる前に、宣言されていないローカル変数をコピーするときに同じ名前のグローバル変数が自動的に作成されます。これは、JavaScriptプログラムで最も一般的なエラーの1つであり、厳密なモードでこれを実行しようとすると、明示的な例外がスローされます。
コードコピーは次のとおりです。
//例外は厳密なモードでスローされます
(関数() {
someundeclaredvar = "foo";
}());
関数のこれは、デフォルトでグローバルを指し示しなくなりました
厳密なモードのもう1つの重要な変更は、定義または未定義でない(nullまたは未定義)がデフォルトでグローバル環境を指していないこの関数です。これにより、機能のデフォルトの動作に依存するコード実行エラーが発生します。たとえば、次のようになります。
コードコピーは次のとおりです。
window.color = "red";
関数sayscolor(){
アラート(this.color);
}
//厳密なモードでエラーが報告されます。厳密なモードでない場合、「赤」を促します
saycolor();
//厳密なモードでエラーが報告されます。厳密なモードでない場合、「赤」を促します
saycolor.call(null);
これは、割り当てられる前に未定義のままです。つまり、コンストラクターが実行されると、以前に明確な新しいキーワードがない場合は例外がスローされます。
コードコピーは次のとおりです。
function person(name){
this.name = name;
}
//厳密なモードでエラーが発生します
var me = person( "nicholas");
上記のコードでは、以前に新しいものがないため、関数のこれは未定義のままになります。未定義のプロパティを設定できないため、上記のコードにエラーが発生します。非ストライクモード環境では、これはデフォルトでウィンドウグローバル変数にコピーされておらず、実行の結果は、ウィンドウグローバル変数の名前属性を予期せず設定します。
改名を防ぎます
多くのコードを書くとき、オブジェクトのプロパティと関数パラメーターは、誤って重複した名前に簡単に設定されます。この場合、Strictモードは明示的にエラーをスローします
コードコピーは次のとおりです。
//繰り返される変数名は、厳密なモードでエラーを報告します
function dosomething(value1、value2、value1){
//コード
}
//鈍いオブジェクト属性名は、厳密なモードでエラーを報告します。
var object = {
foo: "bar"、
フー:「バズ」
};
上記のコードは、厳密なモードでの構文エラーと見なされ、実行前にプロンプトを取得できます。
安全なeval()
eval()ステートメントは最終的には削除されませんでしたが、厳密なモードでは改善されました。最大の変更は、eval()で実行された変数と関数宣言が、現在の範囲に対応する変数または関数を直接作成しないことです。
コードコピーは次のとおりです。
(関数() {
eval( "var x = 10;");
//非ストリクトモードで、アラート10
//厳密なモードでは、xが定義されていないため、例外がスローされます。
アラート(x);
}());
eval()の実行中に作成された変数または関数は、eval()で保持されます。ただし、例えば、eval()ステートメントのreturn値からeval()で実行結果を明示的に取得できます。
コードコピーは次のとおりです。
(関数() {
var result = eval( "var x = 10、y = 20; x + y");
//残りのステートメントは、厳密なモードまたは非厳密なモードで正しく実行できます。 (Resulstは30です)
アラート(結果);
}());
読み取り専用属性を変更するときに例外をスローします
また、ECMAScript5は、オブジェクトの特定のプロパティを読み取り専用に設定する機能、またはオブジェクト全体を変更しないようにする機能を導入します。ただし、非厳格なモードでは、読み取り専用プロパティを変更しようとすると、静かに失敗するだけです。これは、いくつかのブラウザネイティブAPIを扱う際に発生する可能性があります。この場合、Strict Modeは例外を明示的にスローし、このプロパティを変更することは許可されていないことを思い出させます。
コードコピーは次のとおりです。
var person = {};
object.defineProperty(person、 "name" {
手紙:false、
価値:「ニコラス」
});
//非ストライクモードでは、沈黙が失敗し、例外が厳密なモードでスローされます。
person.name = "john";
上記の例では、名前属性は読み取り専用に設定されています。名前属性の変更を非ストリックモードで実行してもエラーは発生しませんが、変更は成功しません。しかし、厳密なモードは明らかに例外をスローします。
注:ECMAScript属性を使用して指定するときに厳密なモードを有効にすることを強くお勧めします。
それを使用する方法は?
最新のブラウザで厳格なモードを有効にするのは非常に簡単です。JavaScriptコードに次のコマンドを表示する必要があります
「Strictを使用」;
上記のコードは特定の変数を与えない文字列にすぎないようですが、実際にはJavaScriptエンジンがStrictモードに切り替わることを意味します(Strictモードをサポートしないブラウザは上記のコードを無視し、後続の実行に影響を与えません)。この命令をグローバルまたは関数に適用することはできますが、ここでは、グローバル環境で厳格なモードを有効にしないように思い出させる必要があります。
コードコピーは次のとおりです。
//このように使用しないでください
「Strictを使用」;
function dosomething(){
//コードのこの部分は厳密なモードで実行されます
}
function dosomethingelse(){
//コードのこの部分も厳密なモードで実行されます
}
上記のコードは大きな問題ではないようですが。ただし、ページに導入されたすべてのコードを維持する責任がない場合、この方法でStrictモードを使用すると、Strictモードのためにサードパーティのコードが準備されていないことによって引き起こされる問題が発生します。
したがって、たとえば、関数で厳密なモードを有効にする手順を使用することをお勧めします。
コードコピーは次のとおりです。
function dosomething(){
「Strictを使用」;
//この関数のコードは厳密なモードで実行されます
}
function dosomethingelse(){
//この関数のコードは厳密なモードで実行されません
}
複数の関数で厳密なモードを有効にしたい場合は、すぐにvokedされた関数式(IIFE)を使用します。
コードコピーは次のとおりです。
(関数() {
「Strictを使用」;
function dosomething(){
//この関数は厳密なモードで実行されます
}
function dosomethingelse(){
//この関数は厳密なモードでも実行されます
}
}());
結論は
これからJavaScript Strictモードを有効にすることを強くお勧めします。これは、コードで気付いていないエラーを発見するのに役立ちます。グローバル環境で有効にしないでください。ただし、IIFEをできるだけ使用して(機能式をすぐに実行)、複数の関数に厳密なパターンを適用できます。最初は、これまでに遭遇したことのないエラーメッセージが遭遇しますが、これは正常です。 Strictモードが有効になっている場合は、サポートされているブラウザでテストして、新しい潜在的な問題を発見してください。コードに「Strictを使用する」行を追加するだけで、残りのコードが適切に機能すると仮定しないでください。最後に、Strictモードでより良いコードの書き込みを開始します。
注記:
各ブラウザの厳密なモードサポート状況の概要を次に示します。
このページで現在のブラウザの厳密なモードサポートをテストできます。
厳密なモードの利点:
JavaScriptを強くします
1.これはもはやカプセル化されておらず、通常モードでは、これは常にオブジェクトでした。
2。fun.caller and fun.argumentsは削除可能なプロパティではなく、設定または取得することはできません。
3.引数。Callerは、削除できない属性でもありませんし、設定も取得もできません。
将来のECMAScriptバージョンへの道を開いてください
1.次の予約された単語が追加されました:道具、インターフェイス、let、パッケージ、プライベート、保護、パブリック、静的、収量。
2。メソッド宣言は、スクリプトまたはメソッドの前面に配置する必要があり、その場合またはそのようなステートメントの途中に配置することはできません。