js 箭頭函數(shù)和普通函數(shù)的區(qū)別和this指向看這篇就夠了

this指向問題是個老問題了审洞,網(wǎng)上的教程很多都是相互copy的呼畸,讓萌新一臉蒙痕支,這里簡單總結(jié)下,保證一次性搞懂蛮原。

首先卧须,這里有個問題是js嚴格模式非嚴格模式,嚴格模式和非嚴格模式下this指向稍微有點區(qū)別儒陨,主要就是全局作用域中普通函數(shù)中的this指向問題花嘶,嚴格模式下是指向undefined的,非嚴格模式下是指向window蹦漠。

image.png

現(xiàn)在一般用的都是嚴格模式椭员,比如vue中就是這樣。

image.png

本文案例都是在嚴格模式下津辩。

話入正題:箭頭函數(shù)和普通函數(shù)有什么區(qū)別拆撼?

箭頭函數(shù)沒有arguments參數(shù)容劳、無法作為構(gòu)造函數(shù)喘沿,不能被new、this取決于上下文竭贩,本身沒有this蚜印、使用call,apply等無法改變this指向留量。
而上面箭頭函數(shù)不能做的普通函數(shù)都可以窄赋,其中普通函數(shù)的this指向調(diào)用方哟冬。

普通函數(shù)this指向?

答:普通函數(shù)的this指向調(diào)用方忆绰。

eg1:

image.png

首先這兩種寫法都是一樣的浩峡,這里 a.say是對象a在調(diào)用,因為普通函數(shù)的this指向調(diào)用方错敢,因此這里的this指向a翰灾。

eg2:我們再來驗證下:

image.png

這里我們將a.say的方法引用賦值給了b,然后用window.b調(diào)用稚茅,因此這里的this.namethis指向window

箭頭函數(shù)this指向纸淮?

答:箭頭函數(shù)本身沒有this,this取決于定義時的上下文亚享。也就是說箭頭函數(shù)中的this指向的是定義時的this咽块,而不是執(zhí)行時候的this。

eg1:

image.png

這里say方法是箭頭函數(shù)欺税,在定義時a對象內(nèi)是沒有this的侈沪,當(dāng)前this指向window.。window.b()雖然最后打印的是全局name晚凿,但是實際上是和調(diào)用方無關(guān)的峭竣,this是在定義的時候就確定了。

eg2:

image.png

這里箭頭函數(shù)定義在函數(shù)內(nèi)部晃虫,若當(dāng)做普通函數(shù)直接調(diào)用皆撩,thisundefined若當(dāng)做構(gòu)造函數(shù)實例化this指向構(gòu)造函數(shù)所創(chuàng)建的對象實例哲银。
有的同學(xué)就想扛吞,哎呀?不是一開始就確定了this嗎荆责,怎么值還不一樣誒滥比?注意,這里當(dāng)做構(gòu)造函數(shù)使用相當(dāng)于把它當(dāng)做了做院,性質(zhì)都不一樣盲泛,this不一樣完全是可以理解的。

還有一點要注意键耕,這里是用的new 一個實例的方式調(diào)用的寺滚,在嚴格模式下構(gòu)造函數(shù)不加new直接調(diào)用,因為thisundefined屈雄,this.name = xxxx 會報錯村视,如下:

image.png

eg3:

image.png

這個例子出自這篇文章,具有誤導(dǎo)性酒奶,但是理解了上面eg2這個例子你就明白了蚁孔。這里person當(dāng)做構(gòu)造函數(shù)在使用奶赔,函數(shù)內(nèi)getval是定義在構(gòu)造函數(shù)內(nèi)部的箭頭函數(shù),因為對象o在定義時是沒有this的杠氢,因此getval內(nèi)的this是構(gòu)造函數(shù)的this站刑,也就是指向構(gòu)造函數(shù)所創(chuàng)建的對象實例。但是鼻百,person并沒有返回這個this笛钝,該構(gòu)造函數(shù)返回的是另一個對象o,但無論是返回的什么愕宋,getvalthis在定義時就確定了玻靡,那就是構(gòu)造函數(shù)內(nèi)的this

下面是測試使用的代碼中贝,方便大家測試:

    // ----------------- 分割線 ---------------------
    "use strict"
    window.name = '這是全局定義的name'
    var a = {
        name: '11',
        say(){
            console.log(this.name)
        }
    }
    a.say()

    // ----------------- 分割線 ---------------------
    "use strict"
    window.name = '這是全局定義的name'
    var a = {
        name: '11',
        say(){
            console.log(this.name)
        }
    }
    var b = a.say
    window.b()

    // ----------------- 分割線 ---------------------
    "use strict"
    window.name = '這是全局定義的name'
    var a = {
        name: '11',
        say: () => {
            console.log(this.name)
        }
    }
    a.say()
    var b = a.say
    window.b()

    // ----------------- 分割線 ---------------------
    "use strict"
    var fn = function () {
        this.name = '這是函數(shù)內(nèi)定義的name'
        console.log(this)
        var a = {
            name: '11',
            say: () => {
                console.log(this)
            }
        }
        a.say()
    }
    var b = new fn()
    //    fn()

    // ----------------- 分割線 ---------------------
    "use strict"
    function person(fg) {
        this.name = '這是person內(nèi)部'
        let o = new Object()
        o.flag = fg
        o.getval = () => {
            console.log(this)
        }
        return o
    }

    let pp = new person('251')
    pp.getval()

進階:注意this指向改變問題

    "use strict"
    var obj = {
        func() {
            console.log('-----', this)
            function fn() {
                console.log('func', this)
            }

            fn()
        },
        func1() {
            console.log('-----', this)
            setTimeout(function () {
                console.log('func1', this);
            })
        },
        func2() {
            console.log('-----', this)
            setTimeout(() => {
                console.log('func2', this);
            })
        }
    }
    obj.func();
    obj.func1();
    obj.func2();
image.png

若對你有幫助囤捻,請點個贊吧,謝謝支持邻寿!

本文地址:http://www.reibang.com/p/cdf9e4f6312b蝎土,轉(zhuǎn)載請注明出處,謝謝绣否。

參考:
https://blog.csdn.net/m0_61843874/article/details/123247934
https://blog.csdn.net/tanzhou123/article/details/105919159?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165577960616782388095394%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=165577960616782388095394&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-1-105919159-null-null.142v19control,157v15new_3&utm_term=%E7%AE%AD%E5%A4%B4%E5%87%BD%E6%95%B0%E7%9A%84this%E6%8C%87%E5%90%91+%E9%98%AE%E4%B8%80%E5%B3%B0&spm=1018.2226.3001.4187

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末誊涯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒜撮,更是在濱河造成了極大的恐慌暴构,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件段磨,死亡現(xiàn)場離奇詭異取逾,居然都是意外死亡,警方通過查閱死者的電腦和手機苹支,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門砾隅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人债蜜,你說我怎么就攤上這事晴埂。” “怎么了寻定?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵儒洛,是天一觀的道長。 經(jīng)常有香客問我特姐,道長晶丘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任唐含,我火速辦了婚禮浅浮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捷枯。我一直安慰自己滚秩,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布淮捆。 她就那樣靜靜地躺著郁油,像睡著了一般。 火紅的嫁衣襯著肌膚如雪攀痊。 梳的紋絲不亂的頭發(fā)上桐腌,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機與錄音苟径,去河邊找鬼案站。 笑死,一個胖子當(dāng)著我的面吹牛棘街,可吹牛的內(nèi)容都是我干的蟆盐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼遭殉,長吁一口氣:“原來是場噩夢啊……” “哼石挂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎例诀,沒想到半個月后绰沥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡惕稻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疾瓮。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖飒箭,靈堂內(nèi)的尸體忽然破棺而出狼电,到底是詐尸還是另有隱情,我是刑警寧澤弦蹂,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布肩碟,位于F島的核電站,受9級特大地震影響凸椿,放射性物質(zhì)發(fā)生泄漏削祈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望髓抑。 院中可真熱鬧咙崎,春花似錦、人聲如沸吨拍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽羹饰。三九已至伊滋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間队秩,已是汗流浹背笑旺。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留馍资,地道東北人筒主。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像迷帜,于是被迫代替她去往敵國和親物舒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容