国产睡熟迷奷白丝护士系列精品,中文色字幕网站,免费h网站在线观看的,亚洲开心激情在线

      <sup id="hb9fh"></sup>
          1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機構(gòu)

            手機站
            千鋒教育

            千鋒學習站 | 隨時隨地免費學

            千鋒教育

            掃一掃進入千鋒手機站

            領取全套視頻
            千鋒教育

            關(guān)注千鋒學習站小程序
            隨時隨地免費學習課程

            當前位置:首頁  >  技術(shù)干貨  > 你真的知道JavaScript中的this嗎?

            你真的知道JavaScript中的this嗎?

            來源:千鋒教育
            發(fā)布人:wjy
            時間: 2022-09-26 09:52:42 1664157162

              介紹

              在前端面試過程中,面試官經(jīng)常會問一些關(guān)于this關(guān)鍵字的問題,即使是工作多年的人也可能知之甚少。因此,本文對this關(guān)鍵字進行了詳細分析,以便他人深入了解。

              什么是"this"?

              調(diào)用函數(shù)時,將創(chuàng)建一個執(zhí)行環(huán)境,this 在運行時根據(jù)函數(shù)的執(zhí)行環(huán)境綁定。它允許函數(shù)在內(nèi)部引用上下文中的執(zhí)行變量,使函數(shù)編程更加優(yōu)雅和簡潔。

              看看下面的代碼,想想為什么不同的調(diào)用方法會打印出不同的結(jié)果。

            JavaScript中的this1

              其實很簡單,因為不同的調(diào)用方法的this指向不同的點。為什么這指向不同的函數(shù)調(diào)用方法?是什么決定了這一點?現(xiàn)在讓我們開始帶著問題深入了解這個問題!

              “this”的約束規(guī)則

              默認綁定

              默認綁定規(guī)則下,函數(shù)的運行環(huán)境為全局環(huán)境,this默認指向Window。

              默認綁定規(guī)則如下:

              1、this指向Window的全局函數(shù)

              在全局函數(shù)中直接打印 this 時,可以看到 this 指向 Window。

            JavaScript中的this2

              2、獨立函數(shù)調(diào)用this指向Window

              獨立的函數(shù)調(diào)用,即直接調(diào)用函數(shù),如 foo()。

            JavaScript中的this3

              這里的foo默認鏈接到Window,相當于window.foo()。根據(jù)函數(shù)的隱式綁定規(guī)則,誰調(diào)用誰就指向誰。這里的 this 指向 Window。結(jié)果如下:

            JavaScript中的this4

              同樣,如果嵌套函數(shù)中直接調(diào)用的函數(shù)也是獨立的函數(shù)調(diào)用,那么this也指向Window:

            JavaScript中的this5

              在上面的代碼中,子函數(shù)son也嵌套在對象obj的方法foo中。當直接調(diào)用子方法時,子里面的this指向Window,所以子函數(shù)里面的this.a結(jié)果是全局變量a,也就是10。

              如果要在子函數(shù)中使用 obj 中的變量 a 怎么辦?只需將 this 對象分配給另一個變量,并在子方法中引用此變量:

            JavaScript中的this6

              3、對于自執(zhí)行函數(shù)調(diào)用,this指向window

              自執(zhí)行函數(shù),顧名思義,就是定義函數(shù)后自動調(diào)用的函數(shù),自執(zhí)行函數(shù)的this指向如下代碼:

            JavaScript中的this7

              上面代碼中的foo函數(shù)內(nèi)部嵌套了一個自執(zhí)行函數(shù)son,而son內(nèi)部的this指向Window。這里this指向的原理類似于獨立函數(shù)調(diào)用,即先聲明一個son方法,然后通過son()執(zhí)行該函數(shù)。如果要獲取son中上層對象obj的變量,可以在調(diào)用時將this點作為參數(shù)傳遞給自執(zhí)行函數(shù)son。

              4、閉包里面的this指向Window

              閉包可以理解為一個函數(shù)內(nèi)部定義的函數(shù),可以訪問其他函數(shù)的內(nèi)部變量。當我們查看閉包中的 this 點時,我們可以看到 this 指向 Window。

            JavaScript中的this8

              上面代碼中,foo函數(shù)的第一個this.a的this指向obj對象,所以結(jié)果是20。return函數(shù)調(diào)用的this指向Window,結(jié)果是10。obj.foo ()() 可以理解為:

            JavaScript中的this9

              fn 是 obj.foo() 返回的函數(shù)。fn 函數(shù)是獨立調(diào)用的,this 指向 Window。

              隱式綁定

              當函數(shù)作為方法調(diào)用時,this指向函數(shù)的直接父對象,稱為隱式綁定。

              在隱式綁定規(guī)則中,認為 this 指向調(diào)用函數(shù)的人,并將指向函數(shù)的直接父對象。比如obj.foo()中foo函數(shù)里面的this指向obj,而obj1中的foo函數(shù)。obj2.foo() 指向 obj2。

            JavaScript中的this10

              上面的代碼也是對 foo 函數(shù)的調(diào)用。調(diào)用方法不同,結(jié)果不同。

              ‘exp1’中的foo直接被獨立函數(shù)調(diào)用,所以,this指向Window,結(jié)果為10;‘exp2’中的調(diào)用方法是obj。foo(),foo函數(shù)的this指向上級調(diào)用對象obj;結(jié)果是 20。'exp3' 中 foo 函數(shù)的直接上級對象是 obj2,所以結(jié)果是 30。

              隱式綁定丟失

              隱式綁定丟失意味著隱式綁定的函數(shù)丟失了它的綁定對象,所以默認綁定到Window。這種方法在我們的項目中很容易導致錯誤,但也很常見。

              1、隱式綁定的函數(shù)被分配為沒有 this 指向的變量。

              在下面的代碼中,obj下的foo值實際上是foo函數(shù)的地址信息,并不是真正的foo函數(shù)。當 obj.調(diào)用 foo() 時, this 的 this 隱式綁定到 obj。當 var fn=obj.foo 為 fn 分配一個函數(shù)時。相當于把foo函數(shù)的地址賦給fn。這時候fn沒有和obj關(guān)聯(lián),所以這里fn()的運行環(huán)境就是全局環(huán)境,this指向Window,this的結(jié)果a 是 10。

            JavaScript中的this11

              2、隱式綁定的函數(shù)作為參數(shù)傳給函數(shù),丟失了this點。

              當一個隱式綁定的函數(shù)直接作為參數(shù)傳遞給另一個函數(shù)時,這個綁定會丟失,從而指向全局Window。obj.foo作為參數(shù)傳給bar函數(shù)后,this.a的結(jié)果是10。這里bar(obj.foo)等價于var fn=obj.foo; bar(fn)。

            JavaScript中的this12

              3、內(nèi)置對象setTimeout和setInterval函數(shù)的隱式綁定丟失

              內(nèi)置函數(shù) setTimeout 和 setInterval 的 this 默認指向 Window。

            JavaScript中的this13

              對了,當setTimeout或者setInterval的第一個參數(shù)是箭頭函數(shù)時,this會指向上層的函數(shù)執(zhí)行環(huán)境。代碼如下:

            JavaScript中的this14

              顯式綁定

              當我們要將函數(shù)綁定到指定對象時,可以使用call、apply、bind等方法手動改變this的方向,即顯式綁定。

              在下面的代碼中,將 foo 顯式綁定到 p 對象的方法分別使用 call、apply 和 bind 來舉例說明。顯式綁定 call 和 apply 的方法會在顯式綁定后直接調(diào)用,而顯式綁定 this 到 bind 的方法需要手動調(diào)用。

            JavaScript中的this15

              關(guān)于硬裝訂

              顯式綁定可以幫我們把this改成指定對象,但是不能解決隱式綁定缺失的問題,比如:

            JavaScript中的this16

              在上面的代碼中,調(diào)用是綁定 this 指向 p 對象,但最終 this 指向的是 Window。此時,我們可以通過硬綁定來解決這個問題。

            JavaScript中的this17

              “new”綁定

              new綁定是我們常用的方法。事實上,我們可以創(chuàng)建一個構(gòu)造,然后新建一個實例對象。這時候this指向了new出來的實例對象。

              當我們彼此認識時,我們主要做以下事情:

              a、創(chuàng)建一個新對象

              b、讓這一點指向新對象并執(zhí)行構(gòu)造體

              c、將新對象的 proto 屬性設置為指向構(gòu)造的原型對象

              d、判斷構(gòu)造的返回類型。如果是,則返回新對象。如果它是引用類型,它將返回此類型的對象。首先,創(chuàng)建了“Person”的構(gòu)造,然后,通過“new”創(chuàng)建了一個“zhangsan”的實例對象。在“zhangsan”的“foo”函數(shù)中,“this”指向“zhangsan”的實例。

            JavaScript中的this18

              在嚴格模式下,“this”指向一個問題。

              1.獨立調(diào)用函數(shù)的內(nèi)部“this”是“undefined”

            JavaScript中的this19

              2.“call()”和“apply()”中的this總是他們的第一個參數(shù)

            JavaScript中的this20

              總結(jié)

              這是一個比較復雜的知識點。當然,如果我們真的理解了this的原理,那么遇到this所指出的問題就很簡單了。如果我們明白了這一點,不僅可以為前端面試加分,也有利于我們的發(fā)展和學習。

              讓我們總結(jié)一下,其約束原則如下:

              默認綁定,this指向全局Window。

              不要忘記隱藏綁定的丟失。

              它顯示了綁定。他通過使用 call、apply 和 bind 改變了這個方向。

              new綁定,構(gòu)造new的一個實例,this指向new的實例對象。

            tags:
            聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
            10年以上業(yè)內(nèi)強師集結(jié),手把手帶你蛻變精英
            請您保持通訊暢通,專屬學習老師24小時內(nèi)將與您1V1溝通
            免費領取
            今日已有369人領取成功
            劉同學 138****2860 剛剛成功領取
            王同學 131****2015 剛剛成功領取
            張同學 133****4652 剛剛成功領取
            李同學 135****8607 剛剛成功領取
            楊同學 132****5667 剛剛成功領取
            岳同學 134****6652 剛剛成功領取
            梁同學 157****2950 剛剛成功領取
            劉同學 189****1015 剛剛成功領取
            張同學 155****4678 剛剛成功領取
            鄒同學 139****2907 剛剛成功領取
            董同學 138****2867 剛剛成功領取
            周同學 136****3602 剛剛成功領取
            相關(guān)推薦HOT
            大數(shù)據(jù)測試工程師需要具備哪些技能?

            一、理解大數(shù)據(jù)概念大數(shù)據(jù)測試工程師需要理解大數(shù)據(jù)的基本概念和原理,如分布式存儲、MapReduce、實時計算等。他們還需要了解如何處理大規(guī)模的...詳情>>

            2023-10-14 23:43:03
            為什么SpringBoot的 jar 可以直接運行?

            一、JAR文件的結(jié)構(gòu)與執(zhí)行方式Spring Boot的JAR包是Java Archive的縮寫,它是一種壓縮文件格式,可以將Java項目的類文件、資源文件以及依賴庫等...詳情>>

            2023-10-14 23:01:49
            站群服務器是什么?

            站群服務器的含義與用途站群服務器主要用于支持站群,即由一組相互鏈接的網(wǎng)站組成的群體。這些網(wǎng)站通常由同一組織或個人擁有,并且經(jīng)常會互相鏈...詳情>>

            2023-10-14 22:46:12
            自編碼器是什么?

            一、自編碼器原理自編碼器的設計靈感源于神經(jīng)科學中關(guān)于感知系統(tǒng)的認知原理,它的核心思想是將輸入數(shù)據(jù)經(jīng)過編碼過程,形成一個隱藏層的特征表示...詳情>>

            2023-10-14 22:41:10
            什么是云網(wǎng)融合?

            一、云網(wǎng)融合的定義云網(wǎng)融合是指將云計算與網(wǎng)絡技術(shù)相結(jié)合,實現(xiàn)資源的共享、業(yè)務的協(xié)同,將網(wǎng)絡與云端服務深度融合,提供更靈活、高效、安全的...詳情>>

            2023-10-14 22:31:47