入れ子関数内でオブジェクト リテラルを参照する際の落とし穴
オブジェクト リテラルを利用して迅速かつ簡単にデータをカプセル化することは、JavaScript では一般的な方法です。ただし、リテラル自体内で定義された関数内でオブジェクト リテラルを参照するときに発生する潜在的な問題に注意することが重要です。
「この」問題
主な懸念は、入れ子関数内での "this" キーワードの使用に起因します。デフォルトでは、関数がオブジェクトのメソッドとして呼び出されない場合、「this」はグローバル オブジェクト (ウィンドウ) を指します。これにより、オブジェクトのプロパティにアクセスするときに予期しない動作が発生する可能性があります。
例:
次のコード スニペットを考えてみましょう:
var obj = { key1: "it", key2: function() { return this.key1 + " works"; } };
このコードは次のようになります。簡単ですが、出力が期待どおりにならない場合があります。 「key2」が (つまり、「obj」のメソッドとしてではなく) スタンドアロン関数として呼び出された場合、「this」はグローバル オブジェクトを参照し、実行時エラーが発生します。
もう 1 つの落とし穴: 参照漏れ
入れ子関数がまだ保持されている間にオブジェクト リテラルが変更または置換されると、別の潜在的な問題が発生します。元のオブジェクトへの参照。これにより、古い参照が原因で関数が誤動作する可能性があります。
例:
次のコードを考えてみましょう:
var obj = { key1: "it", key2: function() { return obj.key1 + " works"; } }; var newRef = obj; obj = { key1: "something else"; };
この場合、" key2" は、置き換えられた元の "obj" オブジェクトを引き続き参照します。これは、「key2」を呼び出すと不正な値 (「動作する」ではなく「他の動作」) が返されることを意味します。
解決策:
信頼性の高い動作を保証するにはこれらの落とし穴を避けるには、オブジェクトを関数内のローカル変数に格納するか、「bind()」を使用して明示的に関数をオブジェクトにバインドすることをお勧めします。これにより、関数が正しいコンテキストを保持し、オブジェクトのプロパティに正確にアクセスできるようになります。
オブジェクト リテラル自体が変更または置換されるのを防ぐメソッドもあり、参照漏洩に対する保護をさらに強化します。
以上がJavaScript オブジェクト リテラルの入れ子関数が「this」および参照リークの問題を引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。