ECMAScript5 で導入された厳密モードにより、JavaScript ランタイム環境が開発プロセスで最も一般的で見つけにくいエラーの一部を現在とは異なる方法で処理できるようになるため、開発者は「より良い」JavaScript 言語を使用できるようになります。厳密モードをサポートしているのは Firefox だけだったので、私は長い間、このモードについて懐疑的でした。しかし現在、すべての主要なブラウザが最新バージョン (IE10、Opera12、Android4、IOS5 を含む) でストリクト モードをサポートするようになりました。
厳密モードはどのような役割を果たしますか?
厳密モードでは JavaScript に多くの変更が加えられますが、私はそれらを 2 つのカテゴリ (明らかな変更と微妙な変更) に分類します。小規模な改善の目的は、現在の JavaScript のいくつかの詳細な問題を修正することですが、ここでは詳しく説明しません。興味がある場合は、Dmitry Soshnikov による優れた文書 ECMA-262-5 の第 2 章 Strict Mode を参照してください。 。 ここでは、厳密モードによって導入される明らかな変更、厳密モードを使用する前に知っておくべき概念、および最も役立つ変更に焦点を当てます。
特定の機能の学習を開始する前に、厳密モードの目的の 1 つは、デバッグをより速く、より便利に行えるようにすることであることを思い出してください。ランタイム環境にとっては、(厳密モードを有効にしていない JavaScript ランタイム環境でよくあることですが) 黙って失敗したり、奇妙な動作をしたりするよりも、問題を検出したときに明示的にエラーをスローする方が良いです。厳密モードではより多くのエラーがスローされますが、これらのエラーが注意を呼び、以前は見つけるのが難しかった多くの潜在的な問題が修正されるため、これは良いことです。
キーワードを使用して削除
まず、with ステートメントが strict モードから削除されます。with ステートメントを含むコードは、strict モードで例外をスローします。したがって、厳密モードを使用するための最初のステップは、コード内で with を使用しないようにすることです。
グローバル変数の誤った割り当てを防止します
次に、値を割り当てる前にローカル変数を宣言する必要があります。厳密モードが有効になる前に、宣言されていないローカル変数をコピーすると、同じ名前のグローバル変数が自動的に作成されます。これは Javascript プログラムで最も一般的なエラーの 1 つであり、これを厳密モードで実行しようとすると、明示的な例外がスローされます。
関数内の THIS はデフォルトでグローバルを指さなくなりました
厳密モードでのもう 1 つの重要な変更は、未定義または空 (null または未定義) の関数内の this がデフォルトでグローバル環境 (global) を指さなくなったことです。これにより、次のような関数のデフォルトの this 動作に依存する一部のコードの実行でエラーが発生します。
名前の重複を防止します
上記のコードは、厳密モードでは構文エラーとみなされ、実行前にプロンプトが表示されます。
安全な EVAL()
eval() ステートメントは最終的には削除されませんでしたが、厳密モードでは依然としていくつかの改善が加えられました。最大の変更点は、 eval() で実行される変数および関数の宣言が、現在のスコープ内に対応する変数または関数を直接作成しないことです。次に例を示します。
eval() の実行中に作成された変数または関数はすべて eval() に保持されます。ただし、eval() ステートメントの戻り値から、eval() の実行結果を明確に取得できます。例:
読み取り専用プロパティを変更するときに例外がスローされました
ECMAScript5 では、オブジェクトの特定のプロパティを読み取り専用に設定したり、オブジェクト全体を変更不能にしたりする機能も導入されています。 ただし、非厳密モードでは、読み取り専用プロパティを変更しようとするとエラーが表示されずに失敗します。 一部のブラウザーのネイティブ API を処理しているときに、この状況が発生する可能性があります。この場合、厳密モードでは明示的に例外がスローされ、このプロパティの変更が許可されていないことが通知されます。
注: ECMAScript プロパティ属性仕様を使用する場合は、厳密モードを有効にすることを強くお勧めします。
使い方は?
「厳密に使用する」;
結論
今後は JavaScript 厳密モードを有効にすることを強くお勧めします。これにより、コード内の気付かないエラーを見つけることができます。グローバルに有効にしないでください。ただし、IIFE (関数式の即時実行) を可能な限り使用して、複数の関数スコープに厳密モードを適用できます。最初は、これまでに見たことのないエラー メッセージが表示されますが、これは正常な現象です。厳密モードを有効にする場合は、サポートされているブラウザで必ずテストして、新たな潜在的な問題を特定してください。コードに「use strict」行を追加するだけで、コードの残りの部分が機能すると想定しないでください。最後に、厳密モードでより適切なコードの作成を開始します。
注:
以下は、さまざまなブラウザーでの厳密モードのサポートの概要です。
このページでは、現在のブラウザーの厳密モードのサポートをテストできます。
厳密モードの利点:
JavaScript を強化する
1. これはカプセル化されなくなりました。通常モードでは、これは常にオブジェクトです。
2. Fun.caller および fun.arguments は削除できる属性ではなく、設定または取得もできません。
3. Arguments.caller も削除できない属性であり、設定や取得もできません。
将来の ECMAScript バージョンへの道を開く
1. 次の予約語が追加されました:implements、interface、let、package、private、protected、public、static、および yield。
2. メソッド宣言は、if や for などのステートメントの途中ではなく、スクリプトまたはメソッドの先頭に配置する必要があります。