javascriptの基本的な使用this
キーワードは、前の記事で説明されています。 this
ポインティングの鍵はランタイムコンテキストです。ただし、コンテキストが期待を超えて変化すると、問題が発生します。この記事では、この状況とそれを解決する方法に焦点を当てます。
コアポイント
this
this
this
キーワードを明示的にバインドすることで解決できます。 bind()
this
ecmascript 6は、直接囲まれた範囲からthis
this
の値は、関数がどのように呼び出されるかに依存します。この方法では、this
this
this
FAQを解くnewこのセクションでは、this
キーワードを使用するときに発生する最も一般的な問題のいくつかを調査し、それらを解決する方法を学びます。 this
call()
apply()
1 bind()
this
抽出方法を使用します
最も一般的な間違いの1つは、オブジェクトのメソッドを変数に割り当て、が
への参照であると思われていても、実際にはそれ自体への別の参照にすぎません。コールの場所がコンテキストを決定することをすでに知っています。ここでは、コールの場所はthis
であり、これは単純な関数呼び出しです。ベースのない関数(特定のオブジェクトに結合していない関数)を指していることを証明するには、コードの下部に
var car = { brand: "Nissan", getBrand: function() { console.log(this.brand); } }; var getCarBrand = car.getBrand; getCarBrand(); // 输出:undefined
getCarBrand
には、1つの通常の関数のみが含まれていますが、これはもはやcar
オブジェクトのメンバーメソッドではありません。したがって、この場合、this.brand
は実際にはwindow.brand
に変換されます。もちろん、未定義です。オブジェクトからメソッドを抽出すると、再び通常の関数になります。オブジェクトへの接続は遮断されており、予想どおりに機能しなくなりました。言い換えれば、抽出された関数は、それがとるオブジェクトに結合していません。では、どのようにそれを改善するのでしょうか?元のオブジェクトへの参照を保持したい場合は、getBrand()
関数をgetCarBrand
変数に割り当てるときに、getBrand()
オブジェクトにcar
オブジェクトに明示的にバインドする必要があります。 bind()
メソッドを使用して実現できます。
function(){ console.log(this.brand); }
これで、正しい出力を取得します。これは、コンテキストがどのように見えるかについてのコンテキストを正常に再定義したためです。
コールバック関数でを使用します
this
次の問題は、コールバック関数としてメソッド(引数としてを使用)を渡すときに発生します。たとえば、
this
var getCarBrand = car.getBrand.bind(car); getCarBrand(); // 输出:Nissan
が明示的な割り当てではなく、暗黙の割り当てであることです。結果はほぼ同じです - 私たちが得るのは、ボタンオブジェクトにバインドされた通常の関数です。言い換えれば、オブジェクト上でメソッドを実行すると、オブジェクトは元々メソッドを定義したオブジェクトとは異なり、car.getBrand
キーワードは元のオブジェクトではなく、メソッドと呼ばれるオブジェクトを指します。この例を参照してください。getBrand()
(ボタン要素)でcar.getBrand
(ボタン要素)で実行します。したがって、this
はもはやel
を指していませんが、car.getBrand
を指します。元のオブジェクトへの参照を変更せずに保持する場合は、car
メソッドを使用してthis
関数をcar
オブジェクトに明示的にバインドする必要があります。 el
bind()
getBrand()
今、すべてが期待どおりに機能します。 car
var car = { brand: "Nissan", getBrand: function() { console.log(this.brand); } }; var el = document.getElementById("btn"); el.addEventListener("click", car.getBrand);
を使用することです。次の例を考えてみましょう:
this
ここでの出力は、閉鎖関数(内部関数)が外部関数の変数にアクセスできないためです。最終結果は、内部関数の
はthis
に等しいということです。この問題を解決するには、this
を
el.addEventListener("click", car.getBrand.bind(car));
undefined
このバインディングはthis
に相当します。閉鎖を修正するもう1つの一般的な方法は、this.brand
値を別の変数に割り当てることであり、したがって、予期しない変更を防ぐことです。 window.brand
var car = { brand: "Nissan", getBrand: function() { console.log(this.brand); } }; var getCarBrand = car.getBrand; getCarBrand(); // 输出:undefined
ここで、this
、_this
、that
、self
、me
、my
、context
、
、、に割り当てることができます。 、
、、this
、オブジェクトの仮名、またはあなたに合ったその他の名前。重要なのは、元のオブジェクトへの参照を保持することです。 this
function
=>
ecmascript 6 this
new
の救助
var self = this;
前の例では、いわゆる「語彙法
function(){ console.log(this.brand); }
キーワードではなく、いわゆる「ファットアロー」演算子()によって作成されます。通常の関数とは異なり、矢印関数は、直接囲まれたスコープからthis
値を取得します。矢印関数の語彙結合は、演算子であっても上書きできません。次に、矢印関数を使用して
this
this
について覚えておくべきこと
this
オブジェクトコンストラクターではない関数のcall()
apply()
bind()
関数が親オブジェクトのプロパティと呼ばれる場合、this
は親オブジェクトを指します。 null
this
関数が呼び出された場合、new
を使用して、これらのメソッドに渡された最初のパラメーターをポイントします。最初のパラメーターがthis
またはオブジェクトではない場合、this
this
矢印関数を使用する場合(ECMAScript 6で導入)、
これらのシンプルで明確なルールを学習し、
が何を指し示すかを簡単に予測できます。それが望むものではない場合、それを修正するためにどのような方法を使用できるかがわかります。
this
this
概要
javascriptのthis
キーワードは、マスターするのが難しい概念ですが、練習するだけでマスターすることができます。この記事と私の以前の記事があなたの理解の基礎として役立ち、次に頭痛を与えるときに貴重なリファレンスになることを願っています。
javascript faqs for keywords(faqs)
(FAQの部分は、長すぎて以前のコンテンツと非常に複製されているため、ここでは省略されています。FAQの部分は以前に詳細に説明されています。以上がJavaScriptの「この」キーワードをマスターするための最終的な手順の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。