Javascript_javascript スキルの厳密モードの詳細な紹介

WBOY
リリース: 2016-05-16 16:46:02
オリジナル
1435 人が閲覧しました

「厳密モード」は 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 を含む主流ブラウザはすでにそれをサポートしており、多くの大規模プロジェクトがそれを全面的に採用し始めています。

一方、同じコードでも「厳密モード」では実行結果が異なる場合があります。「通常モード」で実行できる一部のステートメントは「厳密モード」では実行されません。これらの内容をマスターすると、JavaScript をより詳しく理解し、より優れたプログラマーになれるでしょう。

この記事では「ストリクトモード」について詳しく紹介します。

2. 「厳密モード」を宣言します


「厳密モード」の宣言は、1 つのステートメントだけで非常に簡単です:

コードをコピーします

コードは次のとおりです:

"use strict";注: 古いバージョンのブラウザでは、これを通常の文字列の行として扱い、無視します。


3. 「厳密モード」を宣言する位置と文脈

スクリプト ファイルの最初の行に「use strict」と入力すると、スクリプト全体が「strict モード」で実行されます。このステートメント行が最初の行ではない場合、その行は無効となり、スクリプト全体が「通常モード」で実行されます。異なるモードのコード ファイルが 1 つのファイルにマージされる場合、これには特別な注意が必要です。
(厳密には、実際の演算結果を生成する文が前にない限り、空のセミコロンの直後など、最初の行に「use strict」を指定する必要はありません。)

コードをコピー

コードは次のとおりです:

<script><p>"use strict"; <br>console.log("これは strict モードです。");</p></script>

<script><span>console.log("これは通常モードです。");<a style="CURSOR: pointer" data="20709" class="copybut" id="copybut20709" onclick="doCopy('code20709')"></script> 上記のコードは、Web ページに 2 つの Javascript コードがあることを示しています。前者のスクリプト タグは厳密モードですが、後者のスクリプト タグは厳密モードではありません。

2. 単一関数の場合


関数本体の最初の行に「use strict」と入力すると、関数全体が「strict モード」で実行されます。




コードをコピー

コードは次のとおりです:

function strict(){" use strict" ;

return "これは strict モードです。";

}
function notStrict() {

return "これは通常モードです。";}

3. スクリプト ファイルを記述する別の方法

最初の呼び出しメソッドはファイルのマージに適していないため、より良いアプローチは 2 番目のメソッドと全体を借用することです。スクリプト ファイルは、すぐに実行される匿名関数に配置されます。
コードをコピー コードは次のとおりです。

(function (){

"use strict";
// ここにコードをいくつか示します

})();

4. 「厳密モード」での構文と動作の変更

「厳密モード」では、JavaScript の構文と動作にいくつかの変更が加えられています。

1. グローバル変数の明示的な宣言

通常モードでは、変数を使用するときに、最初に var で変数を宣言する必要はありません (明示的宣言)。しかし、Strict モードでは、変数は使用する前に var で宣言する必要があります。そうしないと、エラーが発生します。 。

コードをコピー コードは次のとおりです:

"use strict";
v = 1; // エラーが報告されました、v は宣言されていません
for(i = 0; i }

したがって、 strict モードでは、変数は最初に 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 内でのみ使用できます。

コードをコピー コードは次のとおりです:

"use strict";
var x = 2 ;
console.info(eval("var x = 5; x")); // 5
console.info(x); // 2

3. セキュリティ対策の強化

(1) このキーワードがグローバル オブジェクトを指すことを禁止します

コードをコピー コードは次のとおりです

function f(){
return !this;
}
// "this" がグローバル オブジェクト "!this" を指しているため、false を返します。 is false
function f (){
"use strict";
return !this;
}

// strict モードでは this の値は true を返します。未定義なので、「!this」は true です。
したがって、コンストラクターを使用するときに new を追加するのを忘れると、これはグローバル オブジェクトを指さなくなり、エラーが報告されます。
コードをコピー コードは次のとおりです。

function f(){

"use strict";
this.a = 1;
};
f();// エラー、これは未定義です


通常の関数呼び出し f() では、this の値はグローバル オブジェクトを指します。厳密モードでは、この関数が call および apply によって呼び出された場合、thisvalue パラメーターが指定されている場合、this の値は未定義を指します。 null と未定義を除くプリミティブ値 (文字列、数値、ブール値) の場合、thisvalue パラメータの値が未定義または null の場合、this の値はそのプリミティブ値に対応するパッケージング オブジェクトになります。 this の値はグローバル オブジェクトを指します。厳密モードでは、this の値は型変換なしの thisvalue パラメーターの値になります。

(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,
configurable: true
});
delete o.x ; // 削除成功

5. 明示的なエラー報告

通常モードでは、オブジェクトの読み取り専用プロパティに値を代入してもエラーは報告されませんが、警告なしに失敗します。厳密モードでは、エラーが報告されます。

コードをコピー コードは次のとおりです:

"use strict";
var o = { };
Object.defineProperty(o, "v", { value: 1, writable: false });
o.v = 2; // エラー報告

厳密モードでは、メソッドによって読み取られた属性に値が割り当てられている場合、エラーが報告されます。
コードをコピー コードは次のとおりです:

"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. 名前の重複エラー

厳密モードでは、いくつかの新しい構文エラーが追加されました。

(1) オブジェクトは重複する名前の属性を持つことはできません

通常モードでは、オブジェクトに同じ名前の複数の属性がある場合、最後に割り当てられた属性が以前の値を上書きします。厳密モードでは、これは構文エラーです。

コードをコピー コードは次のとおりです:

"use strict";
var o = {
p: 1,
p: 2
} // 構文エラー
;

(2) 関数には重複した名前のパラメータを含めることはできません

通常モードでは、関数に同じ名前の複数のパラメーターがある場合、arguments[i] を使用してそれらを読み取ることができます。厳密モードでは、これは構文エラーです。

コードをコピーします コードは次のとおりです:

"use strict";
関数f(a , a, b) { // 構文エラー
return ;
}

7. 8 進表記は禁止されています

通常モードでは、整数の最初の桁が 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 ( argument) { } // 構文エラー
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) argument.callee の使用は禁止されています

これは、匿名関数内で自分自身を呼び出すことができないことを意味します。

コードをコピー コードは次のとおりです:

"use strict";
var f = function () { return argument.callee };
f(); // エラーを報告します

9. 関数は最上位レベルで宣言する必要があります

JavaScript の新しいバージョンでは、将来「ブロックレベルのスコープ」が導入される予定です。新しいバージョンに準拠するために、厳密モードでは、グローバル スコープまたは関数スコープの最上位レベルで関数を宣言することのみが許可されます。つまり、関数以外のコード ブロック内で関数を宣言することはできません。

コードをコピー コードは次のとおりです。

"use strict";
if (true) {
function f() { } // 構文エラー
}
for (var i = 0; i function f2() { } //構文エラー
}


10. 予約語

将来 JavaScript の新しいバージョンに移行するために、strict モードには新しい予約語がいくつか追加されます:implements、interface、let、package、private、protected、public、static、yield。
これらの単語を変数名として使用すると、エラーが発生します。

コードをコピー コードは次のとおりです。

function package(protected) { // 構文error
"use strict";
varimplements; // 構文エラー
}

さらに、ECMAscript の 5 番目のバージョン自体も他の予約語 (class、enum、export、 extends、import、super)、および主要なブラウザで追加された const 予約語は変数名として使用できません。
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート