さて、これをキーワードにして何が起こったのかを見てみましょう。
ここでは、最初のコードブロックで楽しいものが得られます。
Say
hiというメソッドがあります。これは、設定されたタイムアウトを呼び出し、キーワードのファーストネームプロパティの値に連結された文字列を取り消したログをキャンセルする関数です。
これは、このコードが何を返すのかを見る前に、これです。
ビデオを一時停止し、このキーワードが何を指しているのか考えてみてください。
最初の2つのルールに戻ると、これはグローバルなコンテキストのキーワードです。
あるいは、宣言されたオブジェクトの中のキーワードです。
宣言されたオブジェクトの内部にあると思っているかもしれませんが、あなたは正しいです。
しかし、set timeoutは後の時点で呼び出されるため、キーワードthisは親オブジェクトを参照しません。
実際にはグローバルオブジェクトを参照します。
これは非常に扱いにくいもので、初心者がたくさんいます。
それで、設定されたタイムアウトが後の時点で呼び出されたので、もう一度それを見てみましょう。
それが接続されているオブジェクトは実際にはウィンドウと同じです。設定されたタイムアウトは、関数が実行されるコンテキストが実際にグローバルであると宣言されたときに、コールドオブジェクトの内部で定義されていますコンテキスト。
だから、私たちはキーワードの正しい文脈を失っているので、この問題をどのように解決することができます。
これを明示的に設定する必要がありますが、これを参照するキーワードが必要です。
コールと適用を使用してこれを行うことができますが、後でその関数を呼び出す必要があるため、それらのいずれかを使用する必要はありません。
呼び出しと適用がすぐに関数を呼び出すことを忘れないでください。
そのようにすると、後の時点で関数を実行するための設定されたタイムアウトの目的が無効になります。
そのため、2番目のコードブロックでバインドされたままになります。バインドメソッドの最初のパラメータとして渡すことで、問題を解決できます。
thisキーワードを参照するのに必要な値は、thisキーワードを最初のパラメータとして渡す理由について完全に混乱している可能性があります。
しかし、一歩踏み込んで、コードオブジェクトの中にこのキーワードが何を参照するのかを尋ねてください。
まあ、それは実際にカルトオブジェクト自体を指しています。
したがって、キーワードの正しい値をバインドしています。これは、バインドメソッドに呼び出された変数に渡すことができるキーワードの代わりに、設定されたタイムアウトの中の関数が呼び出されたときに必要なものです。同じ結果が得られます。
しかし、より一般的には、キーワードthisを使用するコードが表示されます。
要約すると、バインドメソッドはapplyを呼び出すのとは違った関数定義を返し、関数に渡す引数の値がすべてわからないときやキーワードの値を設定するときに非常に便利です非同期コード。
最後の一言
ここで取り上げている資料はかなり進んでいます。
しかし、もしあなたがプロのjavascript開発者になることを望んでいるのであれば、これは生産コードベースで見ることができるコードの一種であり、この例ではかなり面倒であればインタビューで尋ねられます。
心配しないでください。
私はこのトピックをたくさん教えてきました。そして、それは常に最初に人々を混乱させるもので、コードの各行を辿り、何が起きているかを見るためにクロムコンソールに例をタイプするようにしてください。
いつものように、これらの質問を自由に感じる。
私たちはあなたが次のビデオで学ぶのを助けるためにここにいます。
キーワードを決定する最後のルールを簡単に説明します