Strict ModeはECMAScript 5の新機能です。これにより、プログラム全体または関数を「厳格な」操作コンテキストに配置できます。この厳格なコンテキストは、特定の操作を防ぎ、より多くの例外を投げかけます。
ECMAScript 5はECMAScript 3との後方互換性がありますが、厳密なモードでは、ECMAScript 3で好まれないすべての機能は、互換ではなく無効になります(またはエラーが投げられます)。
厳密なモードを有効にするには、次の利点があります。
1.いくつかのプログラミングエラーをキャッチし、例外をスローします。
2.比較的「安全でない」操作(グローバル変数へのアクセスなど)が実行され、例外がスローされます。
3.混乱を招く機能を無効にします。
厳密なモードに関するほとんどの情報は、ES5コード[PDF]の223ページにあります。
(注:ECMAScript 5の厳格なモードは、Firefoxの厳格なモードとは異なります)
厳密なモードを有効にする方法
このステートメントをプログラムの開始時に追加して、スクリプト全体の厳格なモードを有効にします。
コードコピーは次のとおりです。
「Strictを使用」;
また、関数内でのみ厳格モードを有効にすることができます。そうすれば、外部に影響を与えません。
コードコピーは次のとおりです。
関数imstrict(){
「Strictを使用」;
// ...あなたのコード...
}
厳密なモードを有効にするステートメントは、新しい構文なしで、単なる通常の文字列「Strictを使用」します。これは、古いブラウザにマイナスの影響がないことを意味します。
関数内で厳密なモードを有効にする1つの実用的なアプリケーションは、外部コードに影響しないように、Strictモード関数内のJavaScriptクラスライブラリ全体を定義することです。
コードコピーは次のとおりです。
//非ストリクトコード...
(関数(){
「Strictを使用」;
//ライブラリを厳密に定義します...
})();
//非ストリクトコード...
では、Strictモードでスクリプトでどのような変更が加えられていますか?
変数とプロパティ
未定義の変数の割り当ては、この変数をグローバル変数として使用する代わりに失敗します。
書き込み可能なプロパティを備えたプロパティをfalseで書く、falseのある構成可能なプロパティを持つプロパティを削除する、または誤った拡張可能なプロパティを備えたプロパティを追加すると、エラーが発生します(これらの特性は事前に合っています)。過去には、これらの操作は例外を投げませんでしたが、単に静かに失敗しました。
変数、関数、または関数パラメーターで削除操作を実行すると、エラーが発生します。
コードコピーは次のとおりです。
var foo = 'test';
function test(){}
fooを削除します。 // エラー
テストを削除します。 // エラー
関数test2(arg){
argを削除します。 // エラー
}
オブジェクトコンテナ内で同じプロパティを定義すると、例外がスローされます。
コードコピーは次のとおりです。
// エラー
{foo:true、foo:false}
評価します
「eval」という名前(主な目的は、評価関数を変数またはオブジェクトのプロパティに向けること)の使用は禁止されています。
コードコピーは次のとおりです。
//すべてエラーを生成します...
obj.eval = ...
obj.foo = eval;
var eval = ...;
for(var eval in ...){}
関数eval(){}
関数テスト(eval){}
function(eval){}
新しい関数( "eval")
さらに、評価を介して新しい変数を宣言することも無効です。
コードコピーは次のとおりです。
eval( "var a = false;");
print(typeof a); // 未定義
関数
引数オブジェクトを書き換えると、エラーが発生します。
コードコピーは次のとおりです。
引数= [...]; //許可されていません
同じ名前のパラメーターはエラーを引き起こします。
コードコピーは次のとおりです。
(function(foo、foo){})//エラー
arguments.callerとarguments.calleeへのアクセスは例外をスローします。したがって、使用する必要がある匿名関数は、最初に名前が付けられている必要があります。
コードコピーは次のとおりです。
settimeout(function later(){
//物をします...
SettimeOut(後で、1000);
}、1000);
関数の引数、発信者、およびCalleeの特性はもはや存在せず、それらを定義する操作も禁止されています。
コードコピーは次のとおりです。
function test(){}
test.caller = 'caller'; // エラー
最後に、長年の(そして非常に迷惑な)バグが解決されました。NULLまたは未定義がfunction.prototype.callまたはfunction.prototype.applyメソッドの最初のパラメーターとして使用される場合、関数内のこれはグローバルオブジェクトを指します。そして、厳格なモードは、その実行を防ぎ、例外をスローします。
コードコピーは次のとおりです。
(function(){...})。call(null); // 例外
と() { }
with(){}ステートメントは完全に厳密なモードでハングアップします。