「厳密モード」は ECMA-262 Edition 5 で定義された新しい構文であり、これまで一般的に使用されていた一部の書き込みメソッドでは、次のような SyntaxError 例外がスローされることを意味します。 1. 変数
の前に var 宣言がありません。 2. 8 進数の構文を使用します: var n = 023 および var s = "
1. 「strict モード」を使用する理由
「strict モード」を確立する主な目的は次のとおりです。
1. Javascript 構文の不合理で不正確な部分を削除し、いくつかの奇妙な動作を削減します。
2. コード実行の安全性を確保し、コンパイラーの効率を向上させます。実行速度;
4. 将来の Javascript の新しいバージョンへの道を切り開く。
「厳密モード」は、JavaScript のより合理的で安全かつ厳密な開発方向を反映しており、IE 10 を含む主流ブラウザはすでにそれをサポートしており、多くの大規模プロジェクトがそれを全面的に採用し始めています。
この記事では「ストリクトモード」について詳しく紹介します。
2. 「厳密モード」を宣言します
「厳密モード」の宣言は、1 つのステートメントだけで非常に簡単です:
コードは次のとおりです:
"use strict";注: 古いバージョンのブラウザでは、これを通常の文字列の行として扱い、無視します。
3. 「厳密モード」を宣言する位置と文脈
コードをコピー
コードは次のとおりです:
<script><p>"use strict"; <br>console.log("これは strict モードです。");</p></script>
コードをコピー
コードは次のとおりです:
function strict(){" use strict" ;
return "これは strict モードです。";}
function notStrict() {
"use strict";
// ここにコードをいくつか示します
})();
4. 「厳密モード」での構文と動作の変更
「厳密モード」では、JavaScript の構文と動作にいくつかの変更が加えられています。
1. グローバル変数の明示的な宣言
通常モードでは、変数を使用するときに、最初に var で変数を宣言する必要はありません (明示的宣言)。しかし、Strict モードでは、変数は使用する前に var で宣言する必要があります。そうしないと、エラーが発生します。 。
2. 静的バインディング
JavaScript 言語の特徴は、「動的バインディング」が可能であることです。つまり、特定のプロパティやメソッドがどのオブジェクトに属するかは、コンパイル時ではなく実行時に決定されます。
厳密モードでは、動的バインディングにいくつかの制限が課されます。場合によっては、静的バインディングのみが許可されます。つまり、プロパティとメソッドがどのオブジェクトに属するかは、コンパイル段階で決定されます。これにより、コンパイル効率が向上し、コードが読みやすくなり、予期せぬ事態が少なくなります。
具体的には、次のような側面が含まれます。
(1) with ステートメント
with ステートメントでは、コンパイル時に属性がどのオブジェクトに属しているかを判断できないためです。
通常モードでは、JavaScript 言語にはグローバル スコープと関数スコープという 2 つの変数スコープがあります。厳密モードでは、3 番目のスコープである eval スコープが作成されます。
通常モードでは、eval ステートメントのスコープは、グローバル スコープにあるか関数スコープにあるかによって異なります。 strict モードでは、eval ステートメント自体がスコープとなり、グローバル変数を生成できなくなります。生成された変数は eval 内でのみ使用できます。
3. セキュリティ対策の強化
(1) このキーワードがグローバル オブジェクトを指すことを禁止します
"use strict";
this.a = 1;
};
f();// エラー、これは未定義です
(2) 関数内の呼び出しスタックを走査することは禁止されています
"use strict";
f1.caller; // エラー報告
f1.arguments; // エラー報告
}
f1();
4. 変数の削除は禁止されています
厳密モードでは変数を削除できません。構成可能が true に設定されているオブジェクト属性のみを削除できます。
5. 明示的なエラー報告
通常モードでは、オブジェクトの読み取り専用プロパティに値を代入してもエラーは報告されませんが、警告なしに失敗します。厳密モードでは、エラーが報告されます。
6. 名前の重複エラー
厳密モードでは、いくつかの新しい構文エラーが追加されました。
(1) オブジェクトは重複する名前の属性を持つことはできません
通常モードでは、オブジェクトに同じ名前の複数の属性がある場合、最後に割り当てられた属性が以前の値を上書きします。厳密モードでは、これは構文エラーです。
(2) 関数には重複した名前のパラメータを含めることはできません
通常モードでは、関数に同じ名前の複数のパラメーターがある場合、arguments[i] を使用してそれらを読み取ることができます。厳密モードでは、これは構文エラーです。
7. 8 進表記は禁止されています
通常モードでは、整数の最初の桁が 0 の場合、それは 8 進数であることを意味します。たとえば、0100 は 10 進数の 64 に相当します。厳密モードではこの表現は禁止されており、整数の最初のビットは 0 であり、エラーが報告されます。
arguments は関数のパラメータ オブジェクトであり、strict モードではその使用が制限されます。
(1) 引数への代入は許可されていません
(2) 引数はパラメーターの変更を追跡しなくなりました
これは、匿名関数内で自分自身を呼び出すことができないことを意味します。
9. 関数は最上位レベルで宣言する必要があります
JavaScript の新しいバージョンでは、将来「ブロックレベルのスコープ」が導入される予定です。新しいバージョンに準拠するために、厳密モードでは、グローバル スコープまたは関数スコープの最上位レベルで関数を宣言することのみが許可されます。つまり、関数以外のコード ブロック内で関数を宣言することはできません。
将来 JavaScript の新しいバージョンに移行するために、strict モードには新しい予約語がいくつか追加されます:implements、interface、let、package、private、protected、public、static、yield。
これらの単語を変数名として使用すると、エラーが発生します。