3-9选择练习问题不解

3-9选择练习问题不解

https://img1.sycdn.imooc.com//climg/64017b86097409f415060788.jpg

这个f打印出来是:

() => {

                return () => {

                    return () => {

                        console.log(this, this.id);

                    }

                }

            }

我感觉它是个独立的箭头函数了,那t1、t2、t3为啥还是指向foo呢,它不应该指向全局作用域吗?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
好帮手慕小李 2023-03-03 13:32:49

同学你好,解答如下:

先解释整体流程

1、首先要明确本身箭头函数是没有this的。

2、因为箭头函数会继承自作用域链中上一层的this,也就是箭头函数会顺着他的作用域链,一层一层往上找,知道找到有this为止。

3、最终this.id是按照作用域链向上去找的最后找到foo。如foo是箭头函数的话那么还会往上找最终就会找到window。但本题中foo的this指向被重新指定了。那么也就是说foo中的this属于当前的作用域本身。所以找到foo后就直接用foo中的this了。

以下是针对本题的解答:

1、f打印出来是第一个return返回出来的结果。

https://img1.sycdn.imooc.com//climg/64018476098cab0b07820289.jpg

也就是说foo它本身是在全局中的,如下:

https://img1.sycdn.imooc.com//climg/64018503093dae0507520312.jpg

https://img1.sycdn.imooc.com//climg/6401851309f5316c09960202.jpg

那么通过打印的结果可以看出foo正是window.foo,它本身的this确实是指向window。但是foo.call重新定义了this指向。

https://img1.sycdn.imooc.com//climg/6401860809cc78ed06500374.jpg

对比打印一下看看结果:

https://img1.sycdn.imooc.com//climg/640186380940ba1a11550258.jpg

从结果上来看,不难发现foo的this已经被call重新设置指向了。

2、本题中foo.call当已经被指定了,也就是foo作用域中已经将“this”指定后,后续的return箭头函数都会在调用时随着作用域往上找this,最后找到的是foo。

祝学习愉快!

  • 提问者 wey丫儿 #1

    你好,能把他们的作用域链帮忙画一下吗?因为我不理解的点在于它return返回的是一个独立的箭头函数了,为什么它的外层还是foo,这个继承的作用域原理是什么样的

    2023-03-03 14:09:35
  • 提问者 wey丫儿 #2

    还有一点让我纠结的是下面三个值都是直接使用的f这个函数,所以我就觉得它与foo没关系了,那么这样箭头函数没有this,他就向上查找到window我是这样的理解。f与foo的这个关联关系我没太懂

    2023-03-03 14:12:59
  • 好帮手慕小李 回复 提问者 wey丫儿 #3

    1、var f = foo.call({id:1})含义是:调用foo,并把this指向{id:1},foo调用之后返回值第一个return的箭头函数,所以此时的f表示返回的第一个箭头函数,如下:

    https://img1.sycdn.imooc.com//climg/611b7f8a099eda3c10120650.jpg

    2、var t1 = f.call({id:2})()()这句代码含义是:f表示上一句使用call方法调用foo函数返回的箭头函数, f.call({id:2})表示通过调用call方法调用函数。返回结果是里面的箭头函数,f.call({id:2})()表示调用执行f.call({id:2})后返回的函数,f.call({id:2})()() 表示调用执行f.call({id:2})()后返回的函数。老师简单画图标注了一下,同学可以结合下图理解:

    由于foo调用之后return返回值是箭头函数 ,下面的以此类推,调用函数后返回的都是箭头函数,所以即使使用call传入{id:2}对象,this指向的也是foo函数中的this,也就是{id:1}https://img1.sycdn.imooc.com//climg/611b811e09ab2ef620181308.jpg

    3、后面的几句代码也是同样的道理,返回的都是箭头函数,this都是指向foo函数中的this,所以最终只有一个this。

    祝学习愉快!


    2023-03-03 14:36:08
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师