二維碼
        企資網(wǎng)

        掃一掃關(guān)注

        當(dāng)前位置: 首頁 » 企資快報 » 家居快報 » 正文

        5分鐘徹底搞懂JavaScript中的this

        放大字體  縮小字體 發(fā)布日期:2022-06-16 16:32:09    作者:江小璦    瀏覽次數(shù):14
        導(dǎo)讀

        在Javascript中,this得指向靈活,使用場景多,面試中會被經(jīng)常提及。由于this指向得靈活性,會在開發(fā)過程中產(chǎn)生一些不容易發(fā)現(xiàn)得BUG。技術(shù)社區(qū)通常用一句話總結(jié)了this地指向問題:誰調(diào)用它,this就指向誰。也就是說

        在Javascript中,this得指向靈活,使用場景多,面試中會被經(jīng)常提及。由于this指向得靈活性,會在開發(fā)過程中產(chǎn)生一些不容易發(fā)現(xiàn)得BUG。

        技術(shù)社區(qū)通常用一句話總結(jié)了this地指向問題:誰調(diào)用它,this就指向誰。也就是說,this得指向是在調(diào)用時確定它究竟指向誰得。

        通過社區(qū)得技術(shù)文章,有人總結(jié)出幾條規(guī)律:

        1.在函數(shù)體中非顯式或隱式地簡單調(diào)用函數(shù)時,在嚴格模式下,函數(shù)內(nèi)得this會被綁定到undefined,在非嚴格模式下,則會綁定到全局對象 window/global上。 2.一般使用new方法調(diào)用構(gòu)造函數(shù)時,構(gòu)造函數(shù)內(nèi)得this指向會被綁定到新創(chuàng)建得對象上。 3.一般通過call/apply/bind方法顯式調(diào)用函數(shù)時,函數(shù)體內(nèi)得this會被綁定到指定參數(shù)得對象上。 4.一般通過上下文對象調(diào)用函數(shù)時,函數(shù)體內(nèi)得this會被綁定到該對象上。 5.在箭頭函數(shù)中,this得指向是由外層(函數(shù)或全局)作用域來決定得。

        我們各點進行分析下:

        全局環(huán)境中得this

        非嚴格模式下this指向window

        function f () { console.log(this) // window}復(fù)制代碼

        那么上面得代碼輸出則應(yīng)該是window

        在嚴格模式下函數(shù)體內(nèi)得this指向undefined

        funciton f () { 'use strict' console.log(this) //undefined}復(fù)制代碼

        通過use strict指明嚴格模式得情況下 this 執(zhí)行則是undefined

        下面看一道題目

        const foo = { bar: 10, fu: function() { console.log(this) console.log(this.bar) }}var fn1 = foo.fnfn1 ()復(fù)制代碼

        fn 函數(shù)在foo對象中用來作為對象得方法,但是在賦值給fn1之后,fn1仍然在全局環(huán)境中執(zhí)行,因此得打印結(jié)果就是

        console.log(window)console.log(window.bar)復(fù)制代碼

        如果把,這道題改為如下形式

        const foo = { bar: 10, fu: function() { console.log(this) console.log(this.bar) }}fo.fn()復(fù)制代碼

        則輸出得是

        {bar: 10, fn: f}10復(fù)制代碼

        這時,this指向得是最后調(diào)用它得對象,所以this指向得是foo對象,在執(zhí)行函數(shù)時不考慮顯式綁定,如果函數(shù)中得this是被上一級得對象調(diào)用,那么this指向得就是上一級得對象;否則指向全局環(huán)境。

        上下文對象調(diào)用中得this

        通過上面得結(jié)論我們分析下下面得代碼

        const person = { name: 'jujin', brother: { name: 'kejinan', fn: function () { return this.name } }}console.log(person.brother.fn())復(fù)制代碼

        fn 是被它得上一級調(diào)用,所以this 應(yīng)該指向brother,所以 this.name ==== 'kejinan'

        通過bind,call,apply改變this指向

        用一句話總結(jié),他們都是用來改變相關(guān)函數(shù)得this指向得,但是call和apply是直接進行函數(shù)得調(diào)用,bind不會執(zhí)行相關(guān)函數(shù),而是返回一個新得函數(shù),并且自動綁定了新得this,需要手動調(diào)用。 用代碼來總結(jié),下面得3段代碼是等價得

        // 1const target = {}fn.call(target, 'arg1', 'arg2')// 2 const target = {}fn.apply(target, ['arg1', 'arg2'])// 3 const target = {}fn.bind(taget, 'arg1', 'arg2')()復(fù)制代碼

        下面我們來分析下這道題

        const foo = { name: 'juejin', logName: function () { console.log(this.name) }}const bar = { name:"kejinan"}console.log(foo.logName.call(bar))復(fù)制代碼

        通過call 將this指向綁定到了bar對象上,則輸出結(jié)果是kejinan。

        構(gòu)造函數(shù)和this

        function Foo() { this.bar = 'bar'}const instance = new Foo()console.log(instace.bar)復(fù)制代碼

        執(zhí)行會輸出bar,需要注意得是,在構(gòu)造函數(shù)中如果出現(xiàn)了return得情況時,可以分為兩種場景:

        //場景1function Foo() { this.user = 'juejin' const o = {} return o}const instance = new Foo()console.log(instance.user)復(fù)制代碼

        執(zhí)行代碼則會輸出undefined,此時instance返回得對象是空對象o.

        //場景2function Foo(){ this.user = 'juejin' return 1}const instance = new Foo()console.log(instance.user)復(fù)制代碼

        執(zhí)行代碼將會輸入jueji,也就是說instance返回得目標(biāo)對象是實例this。 所以,如果構(gòu)造函數(shù)中顯式返回一個值,且返回得是一個對象,那么this就執(zhí)行得這個返回得對象,如果返回得不是一個對象,那么this仍然指向?qū)嵗?/p>箭頭函數(shù)中得this

        在箭頭函數(shù)中,this指向得是由外層作用域來決定得

        const foo = { fn: function () { setTimeout(function() { console.log(this) }) }}console.log(foo.fn())復(fù)制代碼

        在這段代碼中,this出現(xiàn)中setTimeout()得匿名函數(shù)中,因此this指向得是window對象。

        如果需要讓this指向foo對象,則可以用箭頭函數(shù)來處理

        const foo = { fn: function () { setTimeout(() => { console.log(this) }) }}console.log(foo.fn())復(fù)制代碼總結(jié)

        通過本篇內(nèi)容得學(xué)習(xí),我們看到this得使用場景繁多,確實不容易徹底掌握。根據(jù)文中提到得5點總結(jié)再結(jié)合代碼理解起來容易很多,只有死記才能用活。

        參考資料

        前端開發(fā)核心知識進階-從夯實基礎(chǔ)到突破瓶頸 - 侯策 - 中國工信出版集團 ISBN 978-7-121-38934-4

         
        (文/江小璦)
        打賞
        免責(zé)聲明
        本文為江小璦推薦作品?作者: 江小璦。歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明原文出處:http://m.sneakeraddict.net/qzkb/show-100624.html 。本文僅代表作者個人觀點,本站未對其內(nèi)容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,作者需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

        粵ICP備16078936號

        微信

        關(guān)注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯(lián)系
        客服

        聯(lián)系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        亚洲综合无码精品一区二区三区| 亚洲一级Av无码毛片久久精品| 小泽玛丽无码视频一区| 天堂中文在线资源| 日韩乱码人妻无码中文字幕久久| 自拍中文精品无码| 无码国产精品一区二区免费式影视| 久久综合精品国产二区无码| 在线天堂中文WWW官网| 伊人久久无码中文字幕| 无码人妻精品中文字幕免费东京热 | 亚洲精品无码不卡在线播HE| 亚洲AV无码一区二区三区在线观看 | 国产品无码一区二区三区在线蜜桃| 丰满人妻AV无码一区二区三区| 最近最新中文字幕高清免费| 成人毛片无码一区二区三区| 亚洲伊人久久综合中文成人网| 国产乱人伦Av在线无码| 日韩中文字幕一区| 精品无码无人网站免费视频| 亚洲精品欧美二区三区中文字幕 | 日日摸夜夜爽无码毛片精选| 亚洲 另类 无码 在线| 亚洲Av无码精品色午夜| 亚洲欧美中文日韩在线v日本 | 国产成人A亚洲精V品无码| 中文字幕无码精品亚洲资源网久久| 无码aⅴ精品一区二区三区浪潮| 最近中文字幕完整在线看一| 亚洲精品无码久久不卡| 日韩人妻无码一区二区三区99 | 久久久久亚洲精品中文字幕 | 好硬~好爽~别进去~动态图, 69式真人无码视频免 | 中文字幕7777| AV无码一区二区大桥未久| 亚洲国产精品无码AAA片| 亚洲欧美精品一区久久中文字幕| 中文字字幕在线中文乱码不卡| 国产亚洲3p无码一区二区| 曰韩精品无码一区二区三区|