JavaScriptでこのポインターポインターを調べてください
まず、関数が定義されたときにこのポインティングを決定できないと言わなければなりません。関数が実行された場合にのみ、このポイントが誰であるかを示します。実際、これは最終的にそれを呼ぶオブジェクトを指します(この文にはいくつかの問題があり、後で問題がある理由を説明します。インターネット上のほとんどの記事はこれを言っていますが、多くの場合、それを理解するのは実際には不正確です。次に、次にこの問題について詳しく説明します。
なぜこれを学ぶのですか?機能的なプログラミングとオブジェクト指向のプログラミングを学んだ場合は、何をすべきかを知る必要があります。あなたがそれを学んでいないなら、あなたは当面の間この記事を読む必要はありません。もちろん、興味があれば読むこともできます。結局のところ、これはJSで習得しなければならないものです。
例1:
function a(){var user = "dream chasing"; console.log(this.user); //未定義のconsole.log(this); // window} a();上で言ったことによると、これは最終的にそれを呼ぶオブジェクトを指しています。ここでの関数Aは実際にウィンドウオブジェクトによって指摘されており、次のコードがそれを証明できます。
function a(){var user = "dream chasing"; console.log(this.user); //未定義のconsole.log(this); // window} window.a();上記のコードと同様に、アラートは実際にはウィンドウのプロパティであり、ウィンドウでも指摘されています。
例2:
var o = {user: "chasing dreams"、fn:function(){console.log(this.user); //夢を追いかける}} o.fn();これは、このFNを呼び出してO.FN()を介して実行するため、オブジェクトOを指します。したがって、自然なポインティングはオブジェクトoです。ここで再び強調したいと思います。このポインティングは、関数が作成されたときに決定できないことを強調し、呼び出されたときにのみ決定することができます。それを呼ぶ人は誰でも誰を指しているか、あなたはこれを理解しなければなりません。
実際、例1と例2は十分に正確ではありません。次の例は、上記の理論を覆すことができます。
これを徹底的に理解したい場合は、次のいくつかの例を見なければなりません
例3:
var o = {user: "catching dreams"、fn:function(){console.log(this.user); //夢をキャッチする}} window.o.fn();このコードは上記のコードとほとんど同じですが、なぜこれがウィンドウを指しているのですか?上記の理論に従う場合、これはそれを呼び出すオブジェクトを指します。ここで何か他のことを言わせてください。 WindowsはJSのグローバルオブジェクトです。実際に作成する変数は、ウィンドウに属性を追加するため、ウィンドウを使用してここでOオブジェクトをポイントできます。
上記のこのコードがウィンドウを指していない理由は説明しません。別のコードを見てみましょう。
var o = {a:10、b:{a:12、fn:function(){console.log(this.a); // 12}}} obfn();これはオブジェクトOでも指摘されていますが、これは実行されませんので、最初に言ったことがすべて間違っていると間違いなく言うでしょうか?実際、そうではありませんが、最初は不正確だったというだけです。次に、1つの文を追加します。これが指摘している問題を徹底的に理解できると思います。
ケース1:関数にこれがあるが、前のレベルでオブジェクトによって呼び出されない場合、これはウィンドウを指します。ここで説明する必要があるのは、JSの厳格なバージョンでは、これがウィンドウを指していることですが、ここでは厳格なバージョンの問題については説明しません。知りたい場合は、自分でオンラインで検索できます。
ケース2:関数にこれがあり、この関数が前のレベルのオブジェクトによって呼び出される場合、これは前のレベルでオブジェクトを指します。
ケース3:関数にこれがある場合、この関数には複数のオブジェクトが含まれます。この関数は最も外側のオブジェクトによって呼び出されますが、これは次のレベルのオブジェクトを指します。例3は、あなたがそれを信じないなら、次にいくつかの例を見てみましょう。
var o = {a:10、b:{// a:12、fn:function(){console.log(this.a); // undefined}}} obfn();オブジェクトBには属性Aはありませんが、これはオブジェクトBを指します。これは、このオブジェクトにこれが必要なものがあるかどうかに関係なく、以前のオブジェクトを指しているからです。
別の特別なケース、例4があります。
var o = {a:10、b:{a:12、fn:function(){console.log(this.a); //未定義のconsole.log(this); // window}}} var j = obfn; j();これはここの窓を指しています、それは少し混乱していませんか?実際、それはあなたが文を理解していないからです。これも重要です。
これは常にそれを最後に呼ぶオブジェクトを指します。つまり、それが実行されたときに誰がそれを呼び出すかを意味します。例4では、関数FNはオブジェクトBで参照されていますが、FNを変数jに割り当てるときは実行されないため、最終的にはウィンドウを指します。これは例3とは異なります。例3はFNを直接実行します。
これは実際にはまさにそれですが、状況が異なる場合は、ポインティングは異なります。上記の概要は各場所で少し間違いであり、間違いとは言えませんが、状況は環境によって異なるため、一度にはっきりと説明することはできないので、ゆっくりと経験することができます。
コンストラクターバージョンこれ:
function fn(){this.user = "chasing dreams";} var a = new fn(); console.log(a.user); //夢を追いかけますここで関数FNでオブジェクトAがユーザーを指摘できる理由は、新しいキーワードがこれの方向を変更し、これをオブジェクトaに指すことができるためです。なぜ私はAがオブジェクトだと言うのですか?新しいキーワードを使用することは、オブジェクトインスタンスを作成することであるためです。この文を理解すると、例3を考えることができます。変数Aを使用して、FNのインスタンスを作成します(FNをオブジェクトAにコピーすることに相当)。現時点では、作成されたばかりで実行されていません。この関数fnへの呼び出しはオブジェクトaであるため、これは自然にオブジェクトaです。では、なぜオブジェクトFNにユーザーがいるのですか? FN関数をオブジェクトAにコピーしたため、新しいキーワードを使用することはコピーのコピーと同等です。
上記に加えて、自分でこの方向を変えることもできます。この方向を自分で変更するには、JavaScriptの通話、適用、および結合メソッドの要約を参照してください。これは、この方向を手動でどのように変更するかを詳細に説明しています。
この遭遇が戻ってきたら、小さな問題を更新します
function fn(){this.user = 'dream chaser';戻る {}; } var a = new fn; console.log(a.user); //未定義別のものを見てください
function fn(){this.user = 'dream chaser'; return function(){};} var a = new fn; console.log(a.user); //未定義また来てください
function fn(){this.user = 'キャッチドリームズ'; return 1;} var a = new fn; console.log(a.user); //夢をキャッチする機能fn(){this.user = 'catching dreams'; return undefined;} var a = new fn; console.log(a.user); //夢を捕まえる」それはどういう意味ですか?
戻り値がオブジェクトである場合、これは返されたオブジェクトを指します。戻り値がオブジェクトではない場合、これは関数のインスタンスを指します。
function fn(){this.user = 'caughter'; return undefined;} var a = new fn; console.log(a); // fn {user: "caughter '}もう1つのポイントは、nullもオブジェクトであるが、これはここでのその関数のインスタンスを指しているということです。なぜなら、nullはより特別なものであるためです。
function fn(){this.user = 'zhunting dreams'; null;} var a = new fn; console.log(a.user); //夢のようにZhunting知識ポイントのサプリメント:
1.デフォルトは、厳格なバージョンのこれをウィンドウではなく、未定義です。
2。新しい演算子は、これを関数のポインティング問題を変更します。上記で説明しましたが、この問題について詳しく説明していません。インターネットではめったに言及されていないため、ここで話す必要があります。
function fn(){this.num = 1;} var a = new fn(); console.log(a.num); // 1なぜこれがを指すのですか?まず、新しいキーワードが空のオブジェクトを作成し、その後、この空のオブジェクトにこれを指すように機能アプリケーションメソッドが自動的に呼び出されます。このようにして、関数内のこれはこの空のオブジェクトに置き換えられます。