04代码输出结果-关于箭头函数与普通函数的this指向问题

本文深入探讨了JavaScript中箭头函数与普通函数中this的指向问题。通过示例代码,展示了箭头函数如何继承父级上下文的this,而普通函数在全局环境中this通常指向window。同时,解释了在函数作用域和变量作用域中的差异,以及在对象方法调用中的this行为。最后,讨论了不带this的变量名在不同上下文中的解析规则。
摘要由CSDN通过智能技术生成

箭头函数不绑定this,它的this来源其父所处的上下文。
通过代码来验证一下。

let obj1 = {
            name: 'a',
            fun1: () => {
                name: 'b'
                console.log(this, this.name)
            }

        }
obj1.fun1()

输出结果:window ‘’
箭头函数fun1()的父级是obj1,obj1的上下文是window

那么以此类推,在一个嵌套结构对象中,调用箭头函数,观察它的this,就一定不是window,而是其父级

let obj2 = {
            name: 'a',
            inner: function() {
                name: 'b'
                let fun2 = () => {
                    console.log(this, this.name)
                }

                fun2()

            }

        }
obj2.inner()
        

输出结果 :{name: ‘a’, inner: ƒ} ‘a’
这时候箭头函数中的this 指向的是obj2,name的结果不是b而是a,因为this在其父级。进行了稍微的修改。

let obj2 = {
            name: 'a',
            inner: function() {
                name: 'b'
                let fun2 = () => {
                    console.log(this, this.name)
                }
                let fun3 = function() {
                    console.log(this, this.name)
                }
                let fun4 = function() {
                    console.log(this, name)
                }

                fun2()
                fun3()
                fun4()

            }

        }
obj2.inner()

输出结果:在这里插入图片描述
后两个都是window对象啊,因为fun3和fun4都可以看成是普通的函数,不是箭头函数。而普通函数的调用,this指向的是window,在这里,我又有些疑惑了,如果按照作用域链来看,为什么fun4输出的结果不是b而是空呢?
后来查了资料应该是这样的,作用域分为全局作用域和函数作用域,全局作用域不用多说,而函数作用域应该是只能在函数里,而我之前的obj2是一个对象,所以不成功?

写代码进行了一下验证

        var n = 'windowN'

        function fun5() {
            let n = 'a';
            console.log('fun5', this.n)

            function fun6() {
                console.log('fun6:', this, n, this.n)
            }
            fun6()

        }
        fun5()

输出结果:在这里插入图片描述
因为name有特殊的含义,最好不要用name给变量起名,所以选择了n作为变量名
用var定义的变量会作为window对象的属性,在内部的fun6中,分别输出this,n,this.n,可以从输出结果来看,此时window指向的还是window对象,因为fun6本身还只是一个普通的函数罢了,不是么?但是不加this和加了this的结果是不同的,this.a指向的还是window对象的n,所以这里是应该要注意的,之前会以为这里的this 指向的父级,输出结果会是’a’

再来看这里的代码

    var number = 50
        let obj2 = {
            number: 4,
            db2: function() {

                console.log('obj2', this.number, number)

                function db3() {
                    console.log('db3', this.number, number)
                }
                db3()
            }

        }

obj2.db2()

在这里插入图片描述

分析输出结果
关于this的指向
普通函数的调用,指向window
对象方法调用,指向该方法所属的对象
执行obj2.db2()后,来到obj2内部,执行第一句
console.log(‘obj2’, this.number, number),这里的this.number结果是4,因为obj2.db2属于对象方法调用,所以指向该方法所属的对象,所以此时this指向obj2,不带this的name表示的window。带有this的指向似乎有些明白了,但是不带this的变量名到底指的是哪个我真的有点迷糊了。
之后执行db3(),没有使用对象方法的调用,所以this表示的window对象,结果很好理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值