この バグ
、vue2 のこの指摘された問題
でアロー関數(shù)を使用したため、同僚が行き詰まり、対応する props# を取得できなくなりました。 ## 。私がそれを紹介したとき、彼はそれを知りませんでした。その後、私はわざとフロントエンド コミュニケーション グループに目を向けました。今のところ、フロントエンド プログラマの少なくとも 70% はまだそれを理解していません。それを共有します。今日はあなたと一緒に
thisポイント、何も學んでいないなら、大きな口を立ててください。
1. 場所の呼び出し
- スコープは定義された場所に関連しており、実行される場所とは関係ありません
- this
ポインタは、どこで定義されるかには関係なく、どのように呼び出されるか、そしてどのような形式で呼び出されるかに関係します。
- this
(this) どのように this関數(shù)が呼び出されます (覚えておくと便利です)
理解を容易にするために、デフォルトでは厳密モードは有効になっていません
#2. バインディング ルール
上でも紹介しましたが、this ポインティングは主に呼び方の形式によって決まります。次に、呼び出しルールを紹介します。ルールがなければ何も完成しません。この呼び出しルールを覚えておいてください。難しいことは何もありません。」
- 呼び出し元の場所を見つけて、次の 4 つのバインド ルールのどれであるかを判斷する必要があります。
- 次に、これら 4 つのバインド ルールの優(yōu)先順位も把握しておく必要があります。
- これら 2 つの點を理解していると、これがどこを指しているのかを簡単に理解できるでしょう。
最も一般的なのは関數(shù)です。 used 呼び出しメソッド、呼び出し関數(shù)のタイプ: 獨立した関數(shù)呼び出し
function?bar()?{ ??console.log(this)?//?window }bar は修飾子のない直接呼び出しであるため、デフォルトのバインディングは
- window
-
## です。 #厳密モー??ドでは、
this ここは - 未定義
最も一般的な用語を使用します。 、それは意味します: オブジェクトには特定のメソッドがあり、そのメソッドはこのオブジェクトを通じてアクセスされ、直接呼び出されます (注: アロー関數(shù)は特別であり、これについては後で説明します) const?info?=?{
??fullName:?'ice',
??getName:?function()?{
????console.log(this.fullName)
??}
}
info.getName()?//?'ice'
この関數(shù)は
info- 呼び出しが開始され、暗黙的なバインディングが実行されるため、現(xiàn)在の
- this
は
infoとなり、値は
this.fullNameを通じてアクセスされます。は間違いなく
Ice 暗黙的な損失が正常です
場合によっては、暗黙的な損失が実行され、暗黙的にバインドされた関數(shù)がバインドされたオブジェクトが失われます。つまり、デフォルト バインディングになります。デフォルト バインディングの this
値は、現(xiàn)在いる環(huán)境。厳密モードかどうか。const?info?=?{ ??fullName:?'ice', ??getName:?function()?{ ????console.log(this.fullName) ??} } const?fn?=?info.getName fn()?//undefined
この場合、暗黙的な損失が行われ、バインドされたオブジェクトが失われることになりますが、なぜこのような問題が発生するのでしょうか?記憶に詳しい人なら簡単に理解できると思います。
ここには直接呼び出しはありませんが、getName
に対応するメモリ アドレスは infoを通じて検出され、変數(shù)
fn## に割り當てられます。- #その後、呼び出しは
fn
を通じて直接行われました。実際、ここでの本質は、獨立した関數(shù)呼び出し (
window
です) です。 window -
fullName
屬性を取り出します。この屬性は 未定義 -
暗黙的な損失の高度な
である必要があります。最初に理解する必要があるのは、コールバック関數(shù)です。実際、これはこのように理解できます。つまり、今は呼び出すのではなく、パラメーターの形式で他の場所に渡し、別の場所で呼び出します。
<pre class="brush:php;toolbar:false">//申明變量關鍵字必須為var var?fullName?=?'panpan' const?info?=?{ ??fullName:?'ice', ??getName:?function()?{ ????console.log(this.fullName) ??} } function?bar(fn)?{ ??//fn?=?info.getName ??fn()?//?panpan } bar(info.getName)</pre>
まず、
の fn はコールバック関數(shù)
- fn = info.getName
- です。パラメータの受け渡し これは暗黙的な割り當てです。実際、上記の暗黙的な損失と同じ意味を持っています。それらはすべて
fn = info.getName
參照を指しており、これはメモリ アドレスです
this - が失われているため、関數(shù)は獨立して呼び出されます。デフォルトのバインディング ルールは、
this
がグローバルwindow
オブジェクト # であるためです。 ##注: 宣言が「What about - var
」でなければならないのはなぜですか?
var
で宣言された変數(shù)のみがグローバル
window オブジェクトに追加されるためです。 -
If
let\const- 使用済みの場合は、いいえ、変數(shù)を宣言するための 2 つのキーワードを詳しく紹介します
-
しかし、シナリオによっては、暗黙的な損失を望まない場合があります。どうすればよいですか? ディスプレイ バインディングを導入しましょうあなたへの、つまり固定電話です。
2.3 表示バインディング
this -
- の変更は予期せぬものになります。コールバック関數(shù)がどのように実行されるかを制御できないため、呼び出し場所に、これが指す予想されるバインディングがあるかどうかを制御する方法がありません。
2.3.1 call/apply/bind
js の「すべての」関數(shù)には、いくつかの便利な機能があります。これは、そのプロトタイプ チェーンに関連しています。プロトタイプチェーン js を介して継承を偽裝して実裝する方法をプロトタイプに導入します。このうち
call/apply/bind
2.3.2 call
-
call()
方法使用一個指定的this
值和單獨給出的一個或多個參數(shù)來調用一個函數(shù)。- 第一個參數(shù)為固定綁定的
this
對象 - 第二個參數(shù)以及二以后的參數(shù),都是作為參數(shù)進行傳遞給所調用的函數(shù)
- 第一個參數(shù)為固定綁定的
- 備注
- 該方法的語法和作用與?
apply()
?方法類似,只有一個區(qū)別,就是?call()
?方法接受的是一個參數(shù)列表,而?apply()
?方法接受的是一個包含多個參數(shù)的數(shù)組。
- 該方法的語法和作用與?
var?fullName?=?'panpan' const?info?=?{ ??fullName:?'ice', ??getName:?function(age,?height)?{ ????console.log(this.fullName,?age,?height) ??} } function?bar(fn)?{ ??fn.call(info,?20,?1.88)?//ice?20?1.88 } bar(info.getName)
2.3.3 apply
- 與
call
的方法類似,只是參數(shù)列表有所不同- 參數(shù)
-
call
?參數(shù)為單個傳遞 -
apply
參數(shù)為數(shù)組傳遞
-
- 參數(shù)
var?fullName?=?'panpan' const?info?=?{ ??fullName:?'ice', ??getName:?function(age,?height)?{ ????console.log(this.fullName,?age,?height) ??} } function?bar(fn)?{ ??fn.apply(info,?[20,?1.88])?//ice?20?1.88 } bar(info.getName)
2.3.4 bind
-
bind
與apply/call
之間有所不同,bind
傳入this
,則是返回一個this
綁定后的函數(shù),調用返回后的函數(shù),就可以拿到期望的this。 - 參數(shù)傳遞則是
- 調用
bind
時,可以傳入?yún)?shù) - 調用
bind
返回的參數(shù)也可以進行傳參
- 調用
var?fullName?=?'panpan' const?info?=?{ ??fullName:?'ice', ??getName:?function(age,?height)?{ ????console.log(this.fullName,?age,?height)?//ice?20?1.88 ??} } function?bar(fn)?{ ??let?newFn?=?fn.bind(info,?20) ??newFn(1.88) } bar(info.getName)
2.4 new綁定
??談到new
關鍵字,就不得不談構造函數(shù),也就是JS中的 "類",后續(xù)原型篇章在跟大家繼續(xù)探討這個new關鍵字,首先要明白以下幾點,new Fn()
的時候發(fā)生了什么,有利于我們理解this
的指向。
創(chuàng)建了一個空對象
將this指向所創(chuàng)建出來的對象
把這個對象的[[prototype]] 指向了構造函數(shù)的prototype屬性
執(zhí)行代碼塊代碼
如果沒有明確返回一個非空對象,那么返回的對象就是這個創(chuàng)建出來的對象
function?Person(name,?age)?{ ??this.name?=?name ??this.age?=?age } const?p1?=?new?Person('ice',?20) console.log(p1)?//?{name:'ice',?age:20}
- 當我調用
new Person()
的時候,那個this所指向的其實就是p1
對象
3. 綁定優(yōu)先級
3.1 隱式綁定 > 默認綁定
function?bar()?{ ??console.log(this)?//info } const?info?=?{ ??bar:?bar } info.bar()
- 雖然這邊比較有些勉強,有些開發(fā)者會認為這是默認綁定的規(guī)則不能直接的顯示誰的優(yōu)先級高
- 但是從另外一個角度來看,隱式綁定,的this丟失以后this才會指向
widonw或者undefined
,變相的可以認為隱式綁定 > 默認綁定
3.2 顯示綁定 > 隱式綁定
var?fullName?=?'global?ice' const?info?=?{ ??fullName:?'ice', ??getName:?function()?{ ????console.log(this.fullName)? ??} } info.getName.call(this)?//global?ice info.getName.apply(this)?//global?ice info.getName.bind(this)()?//global?ice
- 通過隱式綁定和顯示綁定的一起使用很明顯 顯示綁定 > 隱式綁定
3.3 bind(硬綁定) > ?apply/call
function?bar()?{ ??console.log(this)?//123 } const?newFn?=?bar.bind(123) newFn.call(456)
3.4 new綁定 > bind綁定
首先我們來說一下,為什么是和bind
比較,而不能對call
和apply
比較,思考下面代碼
const?info?=?{ ??height:?1.88 } function?Person(name,?age)?{ ??this.name?=?name ??this.age?=?age } const?p1?=?new?Person.call('ice',?20) //報錯:?Uncaught?TypeError:?Person.call?is?not?a?constructor
new綁定和bind綁定比較
const?info?=?{ ??height:?1.88 } function?Person(name,?age)?{ ??this.name?=?name ??this.age?=?age } const?hasBindPerson?=?Person.bind(info) const?p1?=?new?hasBindPerson('ice',?20) console.log(info)?//{height:?1.88}
- 我們通過
bind
對Person
進行了一次劫持,硬綁定了this為info
對象 -
new
返回的固定this的函數(shù) - 但是我們發(fā)現(xiàn) 并不能干預this的指向
3.5 總結
new關鍵字
> bind
> apply/call
> 隱式綁定
> 默認綁定
4. 箭頭函數(shù) (arrow function)
首先箭頭函數(shù)是ES6
新增的語法
const?foo?=?()?=>?{}
4.1 箭頭函數(shù)this
var?fullName?=?'global?ice' const?info?=?{ ??fullName:?'ice', ??getName:?()?=>?{ ????console.log(this.fullName) ??} } info.getName()?//global?ice
- 你會神奇的發(fā)現(xiàn)? 為什么不是默認綁定,打印結果為
ice
- 其實這是
ES6
的新特性,箭頭函數(shù)不綁定this
,它的this
是上一層作用域,上一層作用域為window
- 所以打印的結果是
global ice
4.2 箭頭函數(shù)的應用場景 進階
- 需求: 在
getObjName
通過this
拿到info
中的fullName
(值為ice
的fullName
)
const?info?=?{ ??fullName:?'ice', ??getName:?function()?{ ????let?_this?=?this ????return?{ ??????fullName:?'panpan', ??????getObjName:?function()?{ ????????console.log(this)?//?obj ????????console.log(_this.fullName) ??????} ????} ??} } const?obj?=?info.getName() obj.getObjName()
當我調用
info.getName()
返回了一個新對象當我調用返回對象的
getObjName
方法時,我想拿到最外層的fullName
,我通過,getObjName
的this訪問,拿到的this卻是obj
,不是我想要的結果我需要在調用
info.getName()
把this保存下來,info.getName()
是通過隱式調用,所以它內部的this就是info對象getObjName
是obj對象,因為也是隱式綁定,this必定是obj對象,繞了一大圈我只是想拿到上層作用域的this而已,恰好箭頭函數(shù)解決了這一問題
const?info?=?{ ??fullName:?'ice', ??getName:?function()?{ ????return?{ ??????fullName:?'panpan', ??????getObjName:?()?=>?{ ????????console.log(this.fullName) ??????} ????} ??} } const?obj?=?info.getName() obj.getObjName()
5. 總結
5.1 this的四種綁定規(guī)則
默認綁定
隱式綁定
顯示綁定 apply/call/bind(也稱硬綁定)
new綁定
5.2 this的優(yōu)先級 從高到低
new綁定
bind
call/apply
隱式綁定
默認綁定
6. 結語
??當一切都看起來不起作用的時候,我就會像個石匠一樣去敲打石頭,可能敲100次,石頭沒有任何反應,但是101次,石頭可能就會裂為兩半 我知道并不是第101次起了作用,而是前面積累所致。
??大家有疑惑可以在評論區(qū)留言 第一時間為大家解答。
(學習視頻分享:web前端開發(fā))

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

WebSocketとJavaScript:リアルタイム監(jiān)視システムを実現(xiàn)するためのキーテクノロジー はじめに: インターネット技術の急速な発展に伴い、リアルタイム監(jiān)視システムは様々な分野で広く利用されています。リアルタイム監(jiān)視を実現(xiàn)するための重要なテクノロジーの 1 つは、WebSocket と JavaScript の組み合わせです。この記事では、リアルタイム監(jiān)視システムにおける WebSocket と JavaScript のアプリケーションを紹介し、コード例を示し、その実裝原理を詳しく説明します。 1.WebSocketテクノロジー

WebSocket と JavaScript を使用してオンライン音聲認識システムを実裝する方法 はじめに: 技術の継続的な発展により、音聲認識技術は人工知能の分野の重要な部分になりました。 WebSocket と JavaScript をベースとしたオンライン音聲認識システムは、低遅延、リアルタイム、クロスプラットフォームという特徴があり、広く使用されるソリューションとなっています。この記事では、WebSocket と JavaScript を使用してオンライン音聲認識システムを実裝する方法を紹介します。

JavaScript と WebSocket を使用してリアルタイム オンライン注文システムを実裝する方法の紹介: インターネットの普及とテクノロジーの進歩に伴い、ますます多くのレストランがオンライン注文サービスを提供し始めています。リアルタイムのオンライン注文システムを実裝するには、JavaScript と WebSocket テクノロジを使用できます。 WebSocket は、TCP プロトコルをベースとした全二重通信プロトコルで、クライアントとサーバー間のリアルタイム雙方向通信を実現(xiàn)します。リアルタイムオンラインオーダーシステムにおいて、ユーザーが料理を選択して注文するとき

JavaScript と WebSocket: 効率的なリアルタイム天気予報システムの構築 はじめに: 今日、天気予報の精度は日常生活と意思決定にとって非常に重要です。テクノロジーの発展に伴い、リアルタイムで気象データを取得することで、より正確で信頼性の高い天気予報を提供できるようになりました。この記事では、JavaScript と WebSocket テクノロジを使用して効率的なリアルタイム天気予報システムを構築する方法を學びます。この記事では、具體的なコード例を通じて実裝プロセスを説明します。私たちは

WebSocket と JavaScript を使用してオンライン予約システムを実裝する方法 今日のデジタル時代では、ますます多くの企業(yè)やサービスがオンライン予約機能を提供する必要があります。効率的かつリアルタイムのオンライン予約システムを実裝することが重要です。この記事では、WebSocket と JavaScript を使用してオンライン予約システムを実裝する方法と、具體的なコード例を紹介します。 1. WebSocket とは何ですか? WebSocket は、単一の TCP 接続における全二重方式です。

JavaScript チュートリアル: HTTP ステータス コードを取得する方法、特定のコード例が必要です 序文: Web 開発では、サーバーとのデータ対話が頻繁に発生します。サーバーと通信するとき、多くの場合、返された HTTP ステータス コードを取得して操作が成功したかどうかを判斷し、さまざまなステータス コードに基づいて対応する処理を実行する必要があります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法を説明し、いくつかの実用的なコード例を示します。 XMLHttpRequestの使用

使用法: JavaScript では、insertBefore() メソッドを使用して、DOM ツリーに新しいノードを挿入します。このメソッドには、挿入される新しいノードと參照ノード (つまり、新しいノードが挿入されるノード) の 2 つのパラメータが必要です。

JavaScript で HTTP ステータス コードを取得する方法の紹介: フロントエンド開発では、バックエンド インターフェイスとの対話を処理する必要があることが多く、HTTP ステータス コードはその非常に重要な部分です。 HTTP ステータス コードを理解して取得すると、インターフェイスから返されたデータをより適切に処理できるようになります。この記事では、JavaScript を使用して HTTP ステータス コードを取得する方法と、具體的なコード例を紹介します。 1. HTTP ステータス コードとは何ですか? HTTP ステータス コードとは、ブラウザがサーバーへのリクエストを開始したときに、サービスが