「Strict Mode」は、ECMA-262エディション5で定義された新しい構文であり、Strict JavaScript構文を使用して実行する必要があることを示しています。過去に使用された執筆方法の中には、次のようなSyntaxErrorの例外をスローするものもあります。
1.変数の前のvar宣言なし
2。オクタル構文を使用:var n = 023およびvar s = "/047"
3。ステートメントで使用します
4。削除を使用して変数名を削除します(属性名ではありません):myvariableを削除します
5。評価または引数を変数名または関数名として使用します
6.将来の予約された単語を使用します(ECMAScript 6で使用される可能性があります6):道具、インターフェイス、レット、パッケージ、プライベート、保護、パブリック、静的、および収量を変数名または関数名として
7.ステートメントブロックで関数宣言を使用:if(a <b){function f(){}}
8。その他のエラー
8.1。オブジェクトのサブフェイスサイズで2つの同一の属性名を使用します:{a:1、b:3、a:7}
8.2。関数パラメーターで2つの同一のパラメーター名を使用します:関数f(a、b、b){}
これらについては、以下で詳しく説明しています。
1.「Strict Mode」を使用する理由
「厳格なモデル」を確立する目的は、主に次のとおりです。
1. JavaScriptの構文の不合理で不完全な側面を排除し、奇妙な動作を減らします。
2。実行中のコードの不安を排除し、実行しているコードの安全性を確保する。
3.コンパイラの効率を改善し、操作速度を向上させます。
4.将来、JavaScriptの新しいバージョンの基礎を築きます。
「Strict Mode」は、JavaScriptのより合理的で、より安全で、より厳密な開発方向を反映しています。 IE 10を含む主流のブラウザはすでにそれをサポートしており、多くの主要なプロジェクトが完全にそれを受け入れ始めています。
一方、同じコードは、「Strict Mode」で異なる実行結果を持つ場合があります。 「通常モード」で実行できるいくつかのステートメントは、「Strictモード」で実行されません。これらのコンテンツを習得すると、JavaScriptをより慎重かつ詳細に理解するのに役立ち、より良いプログラマーになります。
この記事では、「厳格なモデル」の詳細な紹介について説明します。
2。「Strict Mode」を宣言します
「Strict Mode」を宣言することは簡単で、1つのステートメントしかありません。
コードコピーは次のとおりです。「Strictを使用」。
注:古いブラウザはそれを通常の文字列として扱い、無視します。
3.「厳格モード」の位置と文脈関係を宣言する
「Strict Mode」は、主にその位置の範囲に影響します。関数で使用される場合、グローバルスコープやその他の未使用関数を「Strictモード」に変換することはありません。つまり、厳格なパターン宣言の範囲は、その文脈に依存します。厳密なモードがグローバルコンテキスト(関数の範囲外)で宣言されている場合、プログラムのすべてのコードは厳密なモードです。関数で厳密なパターンが宣言されている場合、関数のすべてのコードは厳密なパターンです。たとえば、次の例では、すべてのコードが厳密なモードであり、関数の外側の変数宣言は構文エラーを引き起こします。「変数は厳密なモードで定義されません」。 「厳格モード」を呼び出すには2つの方法があり、さまざまな機会に適しています。
1.スクリプトファイル全体
スクリプトファイルの最初の行に「Strictを使用」すると、スクリプト全体が「Strictモード」で実行されます。この行のステートメントが最初の行にない場合、それは無効であり、スクリプト全体が「通常モード」で実行されます。これには、異なるモードのコードファイルが1つのファイルにマージされた場合、特に注意が必要です。
(厳密に言えば、実際の実行結果を生成する声明が先行しない限り、「使用」は空のセミコロンを直接追跡するなど、最初の行にない可能性があります。)
コードコピーは次のとおりです。
<スクリプト>
「Strictを使用」;
console.log( "これは厳密なモードです。");
</script>
<スクリプト>
console.log( "これは通常モードです。");
</script>
上記のコードは、Webページに2つのJavaScriptコードが順番にあることを示しています。前のスクリプトタグは厳密なモードで、後者はそうではありません。
2。単一の関数の場合
関数本文の最初の行に「Strictを使用」し、関数全体が「Strictモード」で実行されます。
コードコピーは次のとおりです。
function strict(){
「Strictを使用」;
「これは厳格なパターンです。」;
}
function notstrict(){
「これは通常モードです。」を返します。
}
3。スクリプトファイルの回避策
最初のコールメソッドはファイルのマージを助長しないため、2番目のメソッドを借りて、スクリプトファイル全体をすぐに実行される匿名関数に配置することをお勧めします。
コードコピーは次のとおりです。
(関数 (){
「Strictを使用」;
//ここにいくつかのコード
})();
4。「Strict Mode」の下での構文と動作の変化
「Strict Mode」は、JavaScriptの構文と動作にいくつかの変更を加えました。
1。グローバル変数の明示的な宣言
通常モードでは、変数を使用する場合、VARを使用して宣言(明示的に宣言)する必要はありませんが、厳密なモードでは、変数を使用する前にVARを使用する必要があります。そうしないと、エラーが発生します。
コードコピーは次のとおりです。
「Strictを使用」;
v = 1; //エラーが報告されます、Vは宣言されません
(i = 0; i <2; i ++){//エラーが報告された、私は宣言されなかった
}
したがって、厳密なモードでは、使用前にVARコマンドで変数を宣言する必要があります。
2。静的結合
JavaScript言語の特徴は、「動的バインディング」、つまり、特定のプロパティとメソッドに属するオブジェクトがコンパイル時にはなく実行時に決定されることです。
Strictモードは、動的バインディングにいくつかの制限を課します。場合によっては、静的結合のみが許可されます。言い換えれば、属性とメソッドが属するものに反対するものは、コンピレーション段階で決定されます。これにより、コンピレーション効率の向上、コードの読み取りが容易になり、事故が少なくなります。
具体的には、次の側面が関係しています。
(1)ステートメントでの使用は禁止されています
属性が属するコンパイル時間でステートメントを決定できないためです。
コードコピーは次のとおりです。
「Strictを使用」;
var v = 1;
(o){//構文エラー
v = 2;
}
(2)評価範囲を作成します
通常モードでは、JavaScript言語には、グローバルスコープと関数範囲の2つの可変スコープがあります。厳密なモードは、3番目のスコープを作成します:評価スコープ。
通常モードでは、評価ステートメントの範囲は、グローバル範囲にあるのか、機能範囲内かによって異なります。厳密なモードでは、評価ステートメント自体は範囲であり、グローバル変数を生成できなくなります。生成する変数は、評価内でのみ使用できます。
コードコピーは次のとおりです。
「Strictを使用」;
var x = 2;
console.info(eval( "var x = 5; x")); // 5
console.info(x); // 2
3。安全対策の強化
(1)このキーワードは、グローバルオブジェクトを指すことを禁じています
コードコピーは次のとおりです。
関数f(){
戻って!これ;
}
//「これ」がグローバルオブジェクトを指しているため、falseを返します!これはfalseです
関数f(){
「Strictを使用」;
戻って!これ;
}
// trueを返します。厳密なモードでは、この値が未定義であるため、「!これ」が真であるためです。
したがって、コンストラクターを使用する場合、新しい追加を忘れている場合、これはグローバルオブジェクトを指していませんが、エラーを報告します。
コードコピーは次のとおりです。
関数f(){
「Strictを使用」;
this.a = 1;
};
f(); //エラー、これは定義されていません
通常の関数呼び出しf()では、この値はグローバルオブジェクトを指します。厳密なモードでは、この値は未定義を指します。関数が呼び出しを介して呼び出されて適用される場合、渡されたこの値パラメーターがnullおよび未定義を除いてプリミティブ値(文字列、数字、ブール値)である場合、この値は元の値に対応するラッパーオブジェクトになります。この値パラメーターの値が未定義またはnullの場合、この値はグローバルオブジェクトを指します。厳密なモードでは、この値の値はこの値パラメーターの値であり、タイプ変換はありません。
(2)関数内でコールスタックを通過することは禁止されています
コードコピーは次のとおりです。
関数f1(){
「Strictを使用」;
f1.caller; //エラーを報告します
f1.arguments; //エラーを報告します
}
f1();
4.変数の削除を無効にします
変数を厳密なモードで削除することはできません。設定可能なオブジェクトプロパティのみをtrueに設定できます。削除できます。
コードコピーは次のとおりです。
「Strictを使用」;
var x;
xを削除します。 //構文エラー
var o = object.create(null、 'x'、{
値:1、
設定可能:true
});
OXを削除します。 //正常に削除します
5。明示的なエラー
通常モードでは、オブジェクトの読み取り専用プロパティを割り当てると、エラーがなく、静かに失敗するだけです。厳密なモードでは、エラーが報告されます。
コードコピーは次のとおりです。
「Strictを使用」;
var o = {};
object.defineProperty(o、 "v"、{value:1、writable:false});
ov = 2; //エラーを報告します
厳密なモードでは、Getterメソッドを使用して読み取りプロパティを割り当てると、エラーが報告されます。
コードコピーは次のとおりです。
「Strictを使用」;
var o = {
v(){return 1; }
};
ov = 2; //エラーを報告します
厳密なモードでは、拡張が禁止されているオブジェクトに新しい属性を追加すると、エラーが発生します。
コードコピーは次のとおりです。
「Strictを使用」;
var o = {};
object.preventextensions(o);
ov = 1; //エラーを報告します
厳密なモードでは、整理されていないプロパティを削除するとエラーが発生します。
コードコピーは次のとおりです。
「Strictを使用」;
object.prototypeを削除します。 //エラーを報告します
6.エラーを変更します
Strictモードにより、いくつかの構文エラーが追加されています。
(1)オブジェクトは、名前を重複した属性を持つことはできません
通常モードでは、オブジェクトに複数の重複属性がある場合、最後に割り当てられた属性は以前の値をオーバーライドします。厳密なモードでは、これは構文エラーです。
コードコピーは次のとおりです。
「Strictを使用」;
var o = {
P:1、
P:2
}; //構文エラー
(2)関数は、名前が複製されたパラメーターを持つことはできません
通常モードでは、関数に複製名を持つ複数のパラメーターがある場合、引数[i]で読み取ることができます。厳密なモードでは、これは構文エラーです。
コードコピーは次のとおりです。
「Strictを使用」;
関数f(a、a、b){//構文エラー
戻る ;
}
7。オクタル表記は禁止されています
通常モードでは、整数の最初のビットが0の場合、これは10100が小数点で64に等しいなどのオクタル数であることを意味します。厳密なモードはこの表現を禁止します。整数の最初のビットが0の場合、エラーが報告されます。
コードコピーは次のとおりです。
「Strictを使用」;
var n = 0100; //構文エラー
8。引数の制限オブジェクト
引数は関数のパラメーターオブジェクトであり、厳密なモードはその使用を制限します。
(1)引数の割り当ては許可されていません
コードコピーは次のとおりです。
「Strictを使用」;
引数++; //構文エラー
var obj = {set p(arguments){}}; //構文エラー
try {} catch(arguments){} // syntaxエラー
関数arguments(){} //構文エラー
var f = new function( "arguments"、 "'' s strict '; return 17;"); //構文エラー
(2)引数は、パラメーターの変化を追跡しなくなりました
コードコピーは次のとおりです。
関数f(a){
a = 2;
return [a、arguments [0]];
}
f(1); //通常モードは[2,2]です
関数f(a){
「Strictを使用」;
a = 2;
return [a、arguments [0]];
}
f(1); // Strictモードは[2,1]です
(3)引数の使用は禁止されています
これは、匿名関数内で自分自身を呼ぶことができないことを意味します。
コードコピーは次のとおりです。
「Strictを使用」;
var f = function(){return arguments.callee; };
f(); //エラーを報告します
9。関数は最上位で宣言する必要があります
将来、JavaScriptの新しいバージョンで「ブロックレベルの範囲」が導入されます。新しいバージョンに合わせて、Strictモードでは、グローバルスコープまたは関数スコープの最上位レベルで関数のみを宣言できます。つまり、非機能コードブロック内で関数を宣言することは許可されていません。
コードコピーは次のとおりです。
「Strictを使用」;
if(true){
関数f(){} //構文エラー
}
for(var i = 0; i <5; i ++){
関数f2(){} //構文エラー
}
10。言葉を守ってください
将来、JavaScriptの新しいバージョンに移行するために、いくつかの予約された単語が厳密なモードに追加されています:実装、インターフェース、Let、Package、Private、Protectect、Public、Static、Hight。
これらの単語を変数名として使用すると、エラーが発生します。
コードコピーは次のとおりです。
関数パッケージ(保護){//構文エラー
「Strictを使用」;
var amements; //構文エラー
}
さらに、ECMAScriptの5番目のバージョンでは、他の予約された単語(クラス、列挙、エクスポート、拡張、インポート、スーパー)、および主要なブラウザーによって追加されたconstrive reservedワードも規定しています。これは変数名として使用できません。