js 箭头函数和普通函数的区别和this指向看这篇就够了

this指向问题是个老问题了,网上的教程很多都是相互copy的,让萌新一脸蒙,这里简单总结下,保证一次性搞懂。

首先,这里有个问题是js严格模式非严格模式,严格模式和非严格模式下this指向稍微有点区别,主要就是全局作用域中普通函数中的this指向问题,严格模式下是指向undefined的,非严格模式下是指向window。

image.png

现在一般用的都是严格模式,比如vue中就是这样。

image.png

本文案例都是在严格模式下。

话入正题:箭头函数和普通函数有什么区别?

箭头函数没有arguments参数、无法作为构造函数,不能被new、this取决于上下文,本身没有this、使用call,apply等无法改变this指向。
而上面箭头函数不能做的普通函数都可以,其中普通函数的this指向调用方。

普通函数this指向?

答:普通函数的this指向调用方。

eg1:

image.png

首先这两种写法都是一样的,这里 a.say是对象a在调用,因为普通函数的this指向调用方,因此这里的this指向a

eg2:我们再来验证下:

image.png

这里我们将a.say的方法引用赋值给了b,然后用window.b调用,因此这里的this.namethis指向window

箭头函数this指向?

答:箭头函数本身没有this,this取决于定义时的上下文。也就是说箭头函数中的this指向的是定义时的this,而不是执行时候的this。

eg1:

image.png

这里say方法是箭头函数,在定义时a对象内是没有this的,当前this指向window.。window.b()虽然最后打印的是全局name,但是实际上是和调用方无关的,this是在定义的时候就确定了。

eg2:

image.png

这里箭头函数定义在函数内部,若当做普通函数直接调用,thisundefined若当做构造函数实例化this指向构造函数所创建的对象实例。
有的同学就想,哎呀?不是一开始就确定了this吗,怎么值还不一样诶?注意,这里当做构造函数使用相当于把它当做了,性质都不一样,this不一样完全是可以理解的。

还有一点要注意,这里是用的new 一个实例的方式调用的,在严格模式下构造函数不加new直接调用,因为thisundefined,this.name = xxxx 会报错,如下:

image.png

eg3:

image.png

这个例子出自这篇文章,具有误导性,但是理解了上面eg2这个例子你就明白了。这里person当做构造函数在使用,函数内getval是定义在构造函数内部的箭头函数,因为对象o在定义时是没有this的,因此getval内的this是构造函数的this,也就是指向构造函数所创建的对象实例。但是,person并没有返回这个this,该构造函数返回的是另一个对象o,但无论是返回的什么,getvalthis在定义时就确定了,那就是构造函数内的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 = '这是函数内定义的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内部'
        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

若对你有帮助,请点个赞吧,谢谢支持!

本文地址:https://www.jianshu.com/p/cdf9e4f6312b,转载请注明出处,谢谢。

参考:
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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容