JavaScript の this キーワードは、通常の関数とアロー関数で動作が異なるため、混乱を招く可能性があります。このブログ投稿では、これが両方のタイプの関数でどのように機能するかを説明し、これらの違いが存在する理由を探り、JavaScript でこれを理解するために必要な基本知識を提供します。
JavaScript の通常の関数は、function キーワードを使用して定義されます。これらの関数の this の値は、関数の呼び出し方法によって異なります。以下にいくつかの例を示します:
function regularFunction() { console.log(this); } regularFunction(); // Logs the global object (window in browsers)
説明: 非厳密モードでは、関数がグローバル コンテキスト (オブジェクトのメソッドとしてではなく) で呼び出される場合、これはグローバル オブジェクト (ブラウザーのウィンドウまたはノードのグローバル) を参照します。 .js).
'use strict'; function regularFunction() { console.log(this); } regularFunction(); // Logs undefined
関数がオブジェクトのメソッドとして呼び出された場合、これはそのオブジェクトを参照します。
const obj = { method: function() { console.log(this); } }; obj.method(); // Logs obj
説明: この場合、関数は obj のメソッドとして呼び出されるため、これは obj を指します。
関数がコンストラクターとして使用される場合 (new キーワードで呼び出される)、これは新しく作成されたインスタンスを参照します。
function Person(name) { this.name = name; this.sayHello = function() { console.log(`Hello, my name is ${this.name}`); }; } const person1 = new Person('Alice'); person1.sayHello(); // Logs "Hello, my name is Alice" const person2 = new Person('Bob'); person2.sayHello(); // Logs "Hello, my name is Bob"
説明: new で呼び出された場合、Person コンストラクター関数内の this は、作成される新しいインスタンスを参照します。新しいインスタンス (person1 と person2) はそれぞれ、独自の name プロパティと SayHello メソッドを取得します。
呼び出し、適用、またはバインドを使用してこれを明示的にバインドできます。
function regularFunction() { console.log(this); } const obj = { value: 42 }; regularFunction.call(obj); // Logs obj regularFunction.apply(obj); // Logs obj const boundFunction = regularFunction.bind(obj); boundFunction(); // Logs obj
説明: call and apply は、この関数を obj に設定して即座に呼び出しますが、bind はこれを obj に永続的にバインドした新しい関数を作成します。
アロー関数には、独自の this コンテキストがありません。代わりに、周囲の (語彙) スコープからこれを継承します。これにより、特定の状況で矢印関数が便利になります。
アロー関数は、定義されているスコープからこれを継承します。
const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs the global object (window in browsers)
説明: アロー関数には独自の this がありません。彼らはこれを周囲のスコープから使用します。ここでは、関数がグローバル スコープで定義されているため、グローバル オブジェクトを参照します。
'use strict'; const arrowFunction = () => { console.log(this); }; arrowFunction(); // Logs undefined
通常の関数とは異なり、アロー関数はメソッドとして呼び出されたときに独自の this を取得しません。これらは、これを囲んでいるスコープから継承します。
const obj = { method: () => { console.log(this); } }; obj.method(); // Logs the global object (window in browsers) or undefined in strict mode
説明: アロー関数は独自の this をバインドしませんが、字句スコープから継承します。この例では、これは、obj.
ではなく、グローバル オブジェクト、または厳密モードの未定義を参照します。アロー関数が別の関数内で定義されている場合、その関数は外側の関数からこれを継承します。
function outerFunction() { const arrowFunction = () => { console.log(this); }; arrowFunction(); } const obj = { value: 42, outerFunction: outerFunction }; obj.outerFunction(); // Logs obj, because `this` in arrowFunction is inherited from outerFunction
説明: この場合、アロー関数内の this は、outerFunction と同じ this (obj.
) を参照します。イベント ハンドラーのアロー関数は、イベントをトリガーする要素ではなく、周囲の字句スコープからこれを継承します。
const button = document.querySelector('button'); button.addEventListener('click', () => { console.log(this); }); // Logs the global object (window in browsers) or undefined in strict mode
説明: アロー関数はこれをボタン要素にバインドしません。周囲のスコープ (グローバル スコープ、または厳密モードでは未定義) から継承します。
通常の関数とアロー関数の違いは、これをどのように処理するかにあります。
JavaScript での this の動作を理解するには、次の概念を理解する必要があります:
これらの違いを理解すると、より予測可能で保守しやすい JavaScript コードを作成するのに役立ちます。通常の関数を使用しているかアロー関数を使用しているかに関係なく、これがどのように機能するかを知ることは、効果的な JavaScript 開発にとって非常に重要です。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3