コールバック関数で「this」オブジェクトに正しくアクセスする方法
P粉608647033
2023-08-20 16:11:32
<p>イベント ハンドラーを登録するコンストラクターがあります: </p>
<p><br /></p>
<pre class="snippet-code-js lang-js prettyprint-override"><code>function MyConstructor(data, Transport) {
this.data = データ;
Transport.on('データ', function () {
アラート(this.data);
});
}
//転送オブジェクトをシミュレートする
var トランスポート = {
on: 関数(イベント、コールバック) {
setTimeout(コールバック, 1000);
}
};
// メソッドの呼び出し
var obj = new MyConstructor('foo', Transport);</code></pre>
<p><br /></p>
<p>しかし、コールバック関数内では、作成されたオブジェクトの <code>data</code> プロパティにアクセスできません。 <code>this</code> は作成されたオブジェクトを指しているのではなく、別のオブジェクトを指しているようです。 </p>
<p>匿名関数の代わりにオブジェクト メソッドを使用してみました。</p>
<pre class="brush:php;toolbar:false;">function MyConstructor(data, Transport) {
this.data = データ;
Transport.on('データ', this.alert);
}
MyConstructor.prototype.alert = function() {
アラート(この名前);
};</pre>
<p>しかし、同じ問題もありました。 </p>
<p>正しいオブジェクトにアクセスするにはどうすればよいですか? </p>
子コンテキストで親コンテキストにアクセスする方法は次のとおりです:
bind() 関数を使用できます。
bind()
Underscore.js を使用する場合 -関数
を使用します。 リーリーhttp://underscorejs.org/#bind リーリー
2. context/this の参照を別の変数に保存しますリーリー
3. アロー関数リーリー
これについての知識
this
の詳細については、(「コンテキスト」とも呼ばれる) は、すべての関数内の特別なキーワードであり、その値は関数の定義方法ではなく、関数の呼び出し方法にのみ依存します。他の変数とは異なり、字句スコープの影響を受けません (アロー関数を除く、以下を参照)。ここではいくつかの例を示します:### リーリー
このMDNドキュメント
thisを参照してください。
正しい引用方法アロー関数を使用する
ECMAScript 6 では、ラムダ関数と考えることができる arrow 関数 が導入されました。独自の
thisバインディングはありません。代わりに、通常の変数と同様に、this がスコープ内で検索されます。これは、
実際には、特に.bind
を呼び出す必要がないことを意味します。その他の特別な動作もあります。詳細については、MDN ドキュメントを参照してください。リーリー
これは使用しないでくださいthis
とにアクセスする必要はなく、それが参照するオブジェクトにアクセスする必要があります。したがって、簡単な解決策は、オブジェクトを指す新しい変数を作成することです。変数には任意の名前を付けることができますが、一般的な名前は
selfthat
値にアクセスできるという利点もあります。です。
リーリーself
は通常の変数であるため、字句スコープ規則に従い、コールバック関数内でアクセスできます。これには、コールバック関数自体の
thisコールバック関数の明示的な設定
this- パート 1
this
各関数にはメソッドの値は自動的に設定されるため、制御できないように見えるかもしれませんが、実際はそうではありません。
.bind
[Documentation]
thisがあり、これは this## を実行するメソッドを返します。 #値にバインドされた新しい関数。この関数は、this がユーザーによって設定されることを除いて、.bind を呼び出したときとまったく同じように動作します。関数がいつどのように呼び出されるかに関係なく、
this
は常に渡された値を参照します。リーリー
この場合、コールバック関数のthis
をMyConstructor
の値にバインドします。
注:
jQuery のバインディング コンテキストには、jQuery.proxy
[ドキュメント]
thisを使用します。その理由は、イベント コールバックのバインドを解除するときに関数への参照を保存する必要がないためです。 jQuery はこれを内部で処理します。
コールバック関数の設定this - パート 2 コールバック関数を受け入れる一部の関数/メソッドは、コールバック関数のとして使用される値も受け入れます。これは手動バインドと同じですが、関数/メソッドがバインドを実行します。たとえば、
Array#map
[Documentation]
がそのようなメソッドです。その署名は次のとおりです:
リーリー 最初のパラメータはコールバック関数で、2 番目のパラメータは this が参照する値です。以下は不自然な例です: リーリー注:
this
の値を渡すことができるかどうかは、通常、関数/メソッドのドキュメントに記載されています。たとえば、jQuery の$.ajax
メソッド [Documentation] には、context
というオプションが記述されています。FAQ: オブジェクト メソッドをコールバック/イベント ハンドラーとして使用する
リーリー
関数this.method
がクリック イベント ハンドラーとして割り当てられていますが、
document.bodyがクリックされた場合、記録される値は
unknownになります。イベント ハンドラー内では、
thisは
Fooのインスタンスではなく、
document.bodyを参照します。
前に述べたように、this
は、関数
がどのように呼び出されるか ( を指すものであり、 がどのように定義されるか () を指すものではありません)。 コードが次のようになっていると、よりわかりやすいかもしれません:リーリー
解決策 上記と同じ: .bind
または、コールバック/イベントとして匿名関数を使用することによってを使用して、利用可能な場合は
thisを特定の値
に明示的にバインドします。 リーリー