ホームページ  >  記事  >  ウェブフロントエンド  >  ECMAScript 5 Strict Mode入門_基礎知識

ECMAScript 5 Strict Mode入門_基礎知識

WBOY
WBOYオリジナル
2016-05-16 16:11:421340ブラウズ

厳密モードは ECMAScript 5 の新機能で、プログラム全体または特定の関数を「厳密な」動作コンテキストに置くことができます。この厳密なコンテキストにより、特定の操作が妨げられ、より多くの例外がスローされます。

ECMAScript 5 は ECMAScript 3 と下位互換性がありますが、厳密モードでは、ECMAScript 3 で非推奨となったすべての機能は互換性がなく無効になります (またはエラーがスローされます)。

厳密モードを有効にすると、次の利点があります:

1. いくつかのプログラミング エラーをキャッチし、例外をスローします。
2. 比較的「安全でない」操作 (グローバル変数へのアクセスなど) を防止し、例外をスローします。
3. いくつかの紛らわしい機能を無効にします。

厳密モードに関するほとんどの情報は、ES5 仕様 [PDF] の 223 ページに記載されています。

(注: ECMAScript 5 の厳密モードは Firefox の厳密モードとは異なります)

厳密モードを有効にする方法

スクリプト全体で厳密モードを有効にするには、プログラムの先頭に次のステートメントを追加します。

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

'厳密な使用';

外部に影響を与えないように、関数内でのみ厳密モードを有効にすることもできます:
コードをコピー コードは次のとおりです:

関数 imStrict() {
'厳密な使用';
//...あなたのコード...
}

strict モードを有効にするステートメントは、新しい構文を含まない単なる単純な文字列「use strict」です。これは、古いブラウザに悪影響が及ばないことを意味します。

関数内で厳密モードを有効にする実際の応用例は、外部コードに影響を与えないように、厳密モード関数内で Javascript クラス ライブラリ全体を定義することです。

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

// 非厳密コード...

(関数(){
"厳密な使用";

// ライブラリを厳密に定義します...
})();

// 非厳密コード...


では、厳密モードではスクリプトは何が変わるのでしょうか?

変数とプロパティ

未定義の変数への代入は、変数をグローバル変数にする代わりに失敗します。

書き込み可能なプロパティが false のプロパティを書き込むか、構成可能なプロパティが false のプロパティを削除するか、拡張可能なプロパティを false のプロパティで追加すると、エラーが発生します (これらのプロパティは事前に合意されています)。以前は、これらの操作は例外をスローせず、単にサイレントに失敗していました。

変数、関数、または関数パラメーターに対して削除操作を実行すると、エラーが発生します。

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

var foo = 'テスト';
関数 test() { }

delete foo; // エラー
テストを削除; // エラー

関数 test2(arg) {
引数を削除; // エラー
}


オブジェクト コンテナ内で同じプロパティを定義すると、例外がスローされます:
コードをコピー コードは次のとおりです:

//エラー
{ foo: true、foo: false }

評価

「eval」という名前の使用は禁止されています (主な目的は eval 関数が変数またはオブジェクトのプロパティを指すことです)。

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

// すべてエラーが生成されます...
obj.eval = ...
obj.foo = eval;
var eval = ...;
for ( var eval in ... ) {}
関数 eval(){}
関数テスト(評価){}
関数(評価){}
new Function("eval")

さらに、eval を介して新しい変数を宣言しても効果はありません:
コードをコピー コードは次のとおりです:

eval("var a = false;");
print( typeof a ); // 未定義

関数

引数オブジェクトをオーバーライドするとエラーが発生します:

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

引数 = [...] // 許可されません

同じ名前のパラメータはエラーを引き起こします:
コードをコピー コードは次のとおりです:

(function(foo, foo) { }) // エラー

argument.caller および argument.callee にアクセスすると、例外がスローされます。したがって、使用する必要がある匿名関数は、最初に名前を付ける必要があります。たとえば、
コードをコピー コードは次のとおりです:

setTimeout(関数は後で(){
// 何かをします...
setTimeout(後で、1000);
}, 1000 );

関数の引数、呼び出し元、および呼び出し先のプロパティは存在しなくなり、それらを定義した操作は禁止されます。
コードをコピー コードは次のとおりです:

関数 test() { }
test.caller = 'caller' // エラー
;

最後に、長年の (そして非常に迷惑な) バグが解決されました。 Function.prototype.call メソッドまたは Function.prototype.apply メソッドの最初のパラメーターとして null または unknown を使用すると、関数内の this はグローバル オブジェクトを指すようになります。 。 Strict モードでは実行が阻止され、例外がスローされます:
コードをコピー コードは次のとおりです:

(function(){ ... }).call(null); // 例外

with() { }

with() { } ステートメントは、厳密モードでは完全に壊れています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。