JavaScriptの厳格モードとは
JavaScriptの厳格モード(strict mode)は、JavaScriptのより安全で、より予測可能なバージョンを提供するための一部です。厳格モードは、一部のJavaScriptのサイレントエラーをスローするエラーに変換し、JavaScriptエンジンがコードをより高速に実行するのを助ける困難な部分を修正します。
厳格モードを有効にするには、スクリプトの先頭または関数の先頭に 'use strict';
を追加します。これにより、そのスコープ(全体のスクリプトまたは個々の関数)で厳格モードが有効になります。
厳格モードでは、次のような一部のアクションが制限または変更されます:
- 未定義の変数への代入はエラーになります(非厳格モードでは、新しいグローバル変数が作成されます)。
- 読み取り専用のプロパティへの代入、不可削除のプロパティの削除、および既に存在する変数、関数、またはパラメータと同じ名前のパラメータを持つ関数の作成はエラーになります。
this
の値はundefined
(非厳格モードではグローバルオブジェクト)になります。
これらは、JavaScriptのコードをより安全にし、予期しない動作を防ぐための一部の例です。厳格モードは、より良いエラーチェックとより効率的なコード実行を可能にするため、新しいJavaScriptコードを書く際には常に使用することを推奨します。
thisの役割と挙動
JavaScriptの this
キーワードは、実行コンテキストに基づいて異なるオブジェクトを参照します。つまり、this
の値は、それがどのように呼び出されるかによって決まります。
以下に、this
の一般的な使用例を示します:
-
グローバルコンテキストまたは関数内:非厳格モードでは、
this
はグローバルオブジェクト(ブラウザではwindow
)を参照します。しかし、厳格モードではthis
はundefined
になります。 -
メソッド内:メソッドの中で
this
を使用すると、そのメソッドを所有しているオブジェクトを参照します。 -
コンストラクタ内:コンストラクタ関数内で
this
を使用すると、新しく作成されるオブジェクトを参照します。 -
イベントハンドラ内:イベントハンドラ内で
this
を使用すると、そのイベントを受け取った要素を参照します。
これらのルールは、JavaScriptの this
の基本的な挙動を示していますが、call()
、apply()
、bind()
などのメソッドを使用すると、this
の値を明示的に設定することができます。
this
の挙動は、他の多くのプログラミング言語とは異なるため、JavaScriptを学ぶ際には混乱を招くことがあります。しかし、this
の挙動を理解することは、JavaScriptの高度な概念を理解するために重要です。
厳格モードとthisの関係性
JavaScriptの厳格モード(strict mode)と this
キーワードの関係性は、this
の値がどのように決定されるかに大きく影響します。
非厳格モードでは、グローバルコンテキストまたは関数内で this
を使用すると、this
はグローバルオブジェクト(ブラウザでは window
)を参照します。しかし、厳格モードを有効にすると、この挙動は変わります。
厳格モードでは、グローバルコンテキストまたは関数内で this
を使用すると、this
は undefined
になります。これは、グローバルオブジェクトへの不意のアクセスを防ぐための重要な安全対策です。グローバルオブジェクトへの不意のアクセスは、予期しない副作用を引き起こす可能性があります。
したがって、厳格モードは this
の挙動に大きな影響を与え、JavaScriptのコードをより安全にし、予期しない動作を防ぐ役割を果たします。
厳格モードでのthisの使用例
JavaScriptの厳格モードでは、this
の挙動が変わります。以下に、厳格モードでの this
の使用例を示します。
// 非厳格モードでの関数
function nonStrictFunction() {
console.log(this); // グローバルオブジェクト(ブラウザでは 'window')
}
nonStrictFunction();
// 厳格モードでの関数
function strictFunction() {
'use strict';
console.log(this); // 'undefined'
}
strictFunction();
上記の例では、非厳格モードの関数内で this
を呼び出すと、グローバルオブジェクト(ブラウザでは window
)が出力されます。一方、厳格モードの関数内で this
を呼び出すと、undefined
が出力されます。
このように、厳格モードでは this
の挙動が変わり、グローバルオブジェクトへの不意のアクセスを防ぐことができます。これは、予期しない副作用を防ぐための重要な安全対策です。