ホームページ > 記事 > ウェブフロントエンド > Javascript strictモードの詳しい説明
1. 概要
通常の動作モードに加えて、ECMAscript 5 には 2 番目の動作モード「strict モード」が追加されています。名前が示すように、このモードでは Javascript がより厳しい条件で実行されます。
「厳密モード」を確立する主な目的は次のとおりです:
- Javascript 構文の不合理で不正確な部分を削除し、いくつかの奇妙な動作を削減します
- コード実行のいくつかの危険な部分を削除して、コード実行の安全性
- コンパイラの効率を向上させ、実行速度を向上させます
- 将来の Javascript の新しいバージョンへの道を開きます。
「厳密モード」は、JavaScript のより合理的で安全かつ厳密な開発方向を体現しており、IE 10 を含む主流ブラウザはすでにそれをサポートしており、多くの大規模プロジェクトがそれを全面的に採用し始めています。
一方で、同じコードでも「厳密モード」では実行結果が異なる場合があります。「通常モード」で実行できる一部のステートメントは「厳密モード」では実行されません。これらの内容をマスターすると、JavaScript をより詳しく理解し、より優れたプログラマーになれるでしょう。
この記事では「strictモード」について詳しく紹介します。
2. サインの入力
「厳密モード」に入るサインは次の行です:
"use strict";
古いバージョンのブラウザでは、これを通常の文字列の行として扱い、無視します。
3.通話方法
「厳密モード」には、さまざまな場面に適した2つの通話方法があります。
3.1 スクリプトファイル全体の場合
スクリプトファイルの最初の行に「use strict」と入力すると、スクリプト全体が「strict モード」で実行されます。このステートメント行が最初の行ではない場合、効果はなく、スクリプト全体が「通常モード」で実行されます。異なるモードのコード ファイルが 1 つのファイルにマージされる場合、これには特別な注意が必要です。
(厳密には、その前の文が実際の演算結果を生成する文でない限り、空のセミコロンの直後など、先頭行に「use strict」がある必要はありません。)
< script>
"use strict" ";
console.log("これは strict モードです。");
<script><br/> console.log("これは通常モードです。");kly 、もうほぼ 2 年前のことです。今なら認めることができます - 私は約 50 台のコンピューターがある学校のネットワーク上でそれを実行しています。<br/> </script>
上記のコードは、1 つのファイルに 2 つの Javascript コードがあることを示しています。ウェブページ。前者のスクリプト タグは厳密モードですが、後者のスクリプト タグは厳密モードではありません。
3.2 単一関数の場合
関数本体の最初の行に「use strict」と入力すると、関数全体が「strict モード」で実行されます。 3.3 スクリプト ファイルを記述する別の方法
最初の呼び出しメソッドはファイルのマージに役立たないため、より良いアプローチは 2 番目のメソッドを借用し、すぐに実行される匿名関数にスクリプト ファイル全体を入れることです。
"use strict";
(function (){
// ここにいくつかのコード
})();
4. 構文と動作の変更
Strict モードは Javascript の構文と動作に影響します。いくつかの変更を加えました。
"use strict";4.1 グローバル変数の明示的な宣言
通常モードでは、宣言されずに変数に値が割り当てられた場合、デフォルトでグローバル変数になります。厳密モードではこの使用は禁止されており、グローバル変数は明示的に宣言する必要があります。
v = 1 // エラー、v が宣言されていません
for(i = 0; i < 2; i++) { // エラー、i が宣言されていません
}
したがって、strict モードでは、使用する前に var コマンドで変数を宣言する必要があります。
4.2 静的バインディング
Javascript 言語の特徴は、「動的バインディング」、つまり、特定のプロパティとメソッドがどのオブジェクトに属するかがコンパイル時には決定されず、実行時に決定されることです。
厳密モードでは、動的バインディングにいくつかの制限が課されます。場合によっては、静的バインディングのみが許可されます。つまり、プロパティとメソッドがどのオブジェクトに属するかは、コンパイル段階で決定されます。これにより、コンパイル効率が向上し、コードが読みやすくなり、予期せぬ事態が少なくなります。
具体的には、次のような側面が含まれます。
(1) with ステートメント
の使用は禁止されています。これは、with ステートメントはコンパイル時に属性がどのオブジェクトに属しているかを判断できないためです。
"use strict";
var v = 1;
with (o){ // 構文エラー
v = 2;
}
(2) 通常モードで eval スコープ
を作成し、 Javascript 言語には、グローバル スコープと関数スコープの 2 種類の変数スコープがあります。厳密モードでは、3 番目のスコープである eval スコープが作成されます。
通常モードでは、eval ステートメントのスコープは、グローバル スコープにあるか関数スコープにあるかによって異なります。 strict モードでは、eval ステートメント自体がスコープとなり、グローバル変数を生成できなくなります。生成された変数は eval 内でのみ使用できます。
"厳密な使用";
var x = 2;
console.info(eval("var x = 5; x")) // 5
console.info(x);
4.3 セキュリティ対策の強化
(1) このキーワードがグローバルオブジェクトを指すことを禁止する
function f(){したがって、コンストラクターを使用するときに、new を追加するのを忘れると、これはグローバル オブジェクトを指さなくなり、エラーが報告されます。return !this;
function f(){
}
// "this" が指すので false を返すグローバル オブジェクト Object に対して、"!this" は false"use strict";
return !this;
}
// strict モードでは this の値が未定義であるため、true を返します。したがって、「!this」は true です。
function f(){ "use strict"; this.a = 1; }; f() // エラー、これは定義されていません;
(2) 関数内のコールスタックをトラバースすることは禁止されています
function f1(){
"use strict";
f1.caller; // エラーを報告します
f1.arguments; // Report an error
}
f1();
4.4 変数の削除は禁止されています
厳密モードでは変数を削除できません。構成可能項目が true に設定されているオブジェクト プロパティのみを削除できます。
"use strict";
var x;
delete x; // 構文エラー
var o = Object.create(null, {'x': {
value: 1,
configurable: true
} });delete o.x; //削除に成功しました
4.5 明示的なエラー報告
通常モードでは、オブジェクトの読み取り専用属性に値を代入してもエラーは報告されませんが、通知なく失敗するだけです。 。厳密モードでは、エラーが報告されます。
"use strict";
var o = {};Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // エラーを報告します
strict このモードでは、getter メソッドを使用して読み取られたプロパティに値を割り当てるときにエラーが報告されます。
"use strict";
var o = {
get v() { return 1; }};
o.v = 2; // エラー
であるオブジェクトに新しいオブジェクトを追加します。拡張プロパティで禁止されている場合は、エラーが報告されます。
"use strict";
var o = {};
Object.preventExtensions(o);
o.v = 1; // エラー
削除できない属性を削除した場合場合、エラーが報告されます。
"use strict";
delete Object.prototype // エラーを報告する
4.6 名前の重複エラー
厳密モードには、いくつかの新しい構文エラーが追加されました。
(1) オブジェクトは同じ名前の属性を持つことができません
通常モードでは、オブジェクトに同じ名前の複数の属性がある場合、最後に割り当てられた属性が前の値を上書きします。厳密モードでは、これは構文エラーです。
"use strict";
var o = {
p: 1,
p: 2
} // 構文エラー
(2) 関数は重複した名前のパラメータを持つことはできません
通常モードの場合, 関数に同じ名前の複数のパラメーターがある場合、arguments[i] を使用してそれらを読み取ることができます。厳密モードでは、これは構文エラーです。
"use strict";
function f(a, a, b) { // 構文エラー
return ;
}
4.7 8進表記は禁止
通常モードでは最初の整数ビットが 0 の場合、それは 8 進数であることを意味します。たとえば、0100 は 10 進数の 64 に相当します。厳密モードではこの表現は禁止されており、整数の最初のビットは 0 であり、エラーが報告されます。
"use strict";
var n = 0100; // 構文エラー
4.8 引数の制限 object
arguments は関数のパラメータオブジェクトであり、strict モードではその使用が制限されます。
(1) 引数への代入は許可されていません
"use strict";
arguments++ // 構文エラー
var obj = { set p(arguments) { } } // 構文エラー
; try { } catch (arguments) { } // 構文エラー
function argument() { } // 構文エラー
var f = new Function("arguments", "'use strict'; return 17;") / / 構文エラー
(2) 引数はパラメーターの変更を追跡しなくなりました
function f(a) {
a = 2;
return [a, argument[0]];
}
f (1); // 通常モードは [2,2] です
function f(a) {
"use strict";
a = 2;
return [a, argument[0]];
}
f(1) // Strictモードは[2, 1]
(3) argument.callee
の使用は禁止されています。これは、匿名関数内で自分自身を呼び出すことができないことを意味します。
"use strict";
var f = function() { return argument.callee; };
f() // エラーを報告する
4.9 関数はトップレベルで宣言する必要があります
将来のバージョンの新しい Javascript では、「ブロックレベルのスコープ」が導入されます。新しいバージョンに準拠するために、厳密モードでは、グローバル スコープまたは関数スコープの最上位レベルで関数を宣言することのみが許可されます。つまり、関数以外のコード ブロック内で関数を宣言することはできません。
"use strict";
if (true) {
function f() { } // 構文エラー
}
for (var i = 0; i
function f2() { } // 構文エラー
}
4.10 予約語
将来の Javascript の新しいバージョンに移行するために、strict モードにはいくつかの新しい予約語が追加されました:implements、interface、 let、パッケージ、プライベート、プロテクト、パブリック、静的、yield。
これらの単語を変数名として使用するとエラーが発生します。
function package(protected) { // 構文エラー
"use strict";
varimplements; // 構文エラー
}
さらに、ECMAscript の 5 番目のバージョン自体も他の予約語 ( class、enum、export、extends、import、super)、および主要なブラウザで追加された const 予約語は変数名として使用できません。
5. 参考リンク
- MDN、ストリクト モード
- アクセル ラウシュマイヤー博士、JavaScript のストリクト モード: 概要
- Douglas Crockford、ストリクト モードが登場
この記事では、JavaScript ストリクト モードについて説明します。関連コンテンツについては、php 中国語 Web サイトにご注意ください。
関連するおすすめ:
以上がJavascript strictモードの詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。