JavaScript 厳密モード (厳密を使用)
概要
通常の実行モードに加えて、ECMAscript 5 では 2 番目の実行モード「strict モード」が追加されています。名前が示すように、このモードでは Javascript がより厳しい条件で実行されます。
厳密モードを使用する理由
- Javascript 構文の不合理で緩い側面を排除し、奇妙な動作を軽減します
- コード実行の安全でない側面を排除し、コード実行の安全性を確保します。コンパイラの効率と実行速度の向上
- 将来の Javascript の新しいバージョンへの道を開きます。
「厳密モード」は、JavaScript のより合理的で安全かつ厳密な開発方向を体現しており、IE 10 を含む主流ブラウザはすでにそれをサポートしており、多くの大規模プロジェクトがそれを完全に採用し始めています。
一方、同じコードでも「厳密モード」では実行結果が異なる場合があります。「通常モード」で実行できる一部のステートメントは「厳密モード」では実行されません。これらの内容をマスターすると、JavaScript をより詳しく理解し、より優れたプログラマーになれるでしょう。
フラグを入力してください"use strict";
呼び出し方法
1. 単一のスクリプトの場合<script> strict" ; コンソール。 log("これは strict モードです。");
</script>
関数 strict(){
";
return "これはストリクトモードです。 ";
}
function notStrict() {
return "これはノーマルモードです。 }
3 別の方法スクリプト ファイルの作成
(function (){
"use strict";
// ここにコードをいくつか
})(); 例 1:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p>浏览器按下 F12 开启调试模式,查看报错信息。</p> <script> "use strict"; x = 3.14; // 报错 (x 未定义) </script> </body> </html>
例 2:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>php中文网(php.cn)</title> </head> <body> <p>浏览器按下 F12 开启调试模式,查看报错信息。</p> <script> x = 3.14; // 不报错 myFunction(); function myFunction() { "use strict"; y = 3.14; // 报错 (y 未定义) } </script> </body> </html>
構文と動作の変更:
1 グローバル変数の明示的な宣言
通常モードでは、変数が宣言されていない場合、変数が代入されます値。デフォルトはグローバル変数です。厳密モードではこの使用は禁止されており、グローバル変数は明示的に宣言する必要があります。
"use strict";
v = 1; // エラーが報告されました。v は宣言されていません
for(i = 0; i <2; i++) { // エラーが報告されました、i は宣言されています宣言されていません
}
したがって、厳密モードでは、変数は使用前に var コマンドで宣言する必要があります。
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) ; }
// "this" がグローバルオブジェクトを指しているので false を返す
function f(){
"use strict";
return !this;
}
// strict モードでは this の値が定義されていないため、「!this」は true を返します。
(2) 関数内でのコールスタックのトラバースは禁止されていますfunction f1(){
"use strict";
f1.caller; // エラーを報告
f1.arguments; / / エラーを報告します
}
f1();
4 変数の削除は禁止されています
厳密モードでは変数を削除できません。構成可能項目が true に設定されているオブジェクト プロパティのみを削除できます。
"use strict";var x;
delete x; // 構文エラー
var o = Object.create(null, {'x': {
value : 1,
configureable:true
}});
deleteo.x;割り当てはエラーを報告せず、単にサイレントに失敗します。厳密モードでは、エラーが報告されます。
"厳密な使用";
var o = {};
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; // エラー
6 名前の重複エラー
Strict モードでは、いくつかの新しい構文エラーが追加されました。
(1) オブジェクトは重複した名前を持つ属性を持つことができません通常モードでは、オブジェクトに重複した名前を持つ複数の属性がある場合、最後に割り当てられた属性が以前の値を上書きします。厳密モードでは、これは構文エラーです。
"厳密な使用";
p: 2
}; // 構文エラー
(2) 関数は同じ名前のパラメータを持つことはできません
通常モードでは、関数に同じ名前のパラメータが複数ある場合、arguments[i 』を読むことができます。厳密モードでは、これは構文エラーです。
"use strict";
function f(a, a, b) { // 構文エラー
return ;
}
7表記法
通常モードでは、整数の最初の桁が 0 の場合、それは 8 進数であることを意味します。たとえば、0100 は 10 進数の 64 に相当します。厳密モードではこの表現は禁止されており、整数の最初のビットは 0 であり、エラーが報告されます。
"use strict";
var n = 0100; // 構文エラー
8 引数オブジェクトの制限事項
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) {
"厳密な使用";
a = 2;
return [a, argument[0]];
}
f(1); // 厳密モードは [2,1]
(3) で、arguments.callee
の使用を禁止しています。これは、匿名関数内で自分自身を呼び出すことができないことを意味します。
"use strict";
var f = function() { return argument.callee; };
f() // エラーを報告します
"use strict";
if (true) {
function f() { } // 構文エラー
}
for (var i = 0; i < 5; i++) {
function f2() { } // 構文エラー
}
function package(protected) { // 構文エラー
"use strict";
varimplements; // 構文エラー
}