老师这道题感觉怪怪的,不是很明白

正在回答

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

1回答

同学你好,解答如下:

整个代码,只有foo是普通的函数,而foo中返回的函数都是箭头函数(图一):

http://img1.sycdn.imooc.com//climg/611ccb0409e5c0e304640215.jpg

因此只有foo中有this,而箭头函数没有自己的this,它里面的this要沿着作用域往外层查找(图二):

http://img1.sycdn.imooc.com//climg/611ccbe80990587006870260.jpg

call的作用是调用函数改变this的指向,因此var f=foo.call( {id:1} )这句代码,就是调用foo,并把foo中的this指向{id:1}(图三):

http://img1.sycdn.imooc.com//climg/611ccc6d098be14504550091.jpg

foo中使用return设置了返回值,所以变量f就是如下函数(图四)

http://img1.sycdn.imooc.com//climg/611ccf71099b93aa06280396.jpg

先看 var  t1=f.call( {id:2} )( )( )这句代码:

f.call( {id:2} )是调用图四中的函数,因此f.call( {id:2} )的值就是下图中选中的函数:

http://img1.sycdn.imooc.com//climg/611ccd3609d9db1e06450432.jpg

f.call({id:2})( )就是调用上图中返回的函数,f.call({id:2})( )的值如下:

http://img1.sycdn.imooc.com//climg/611ccdbf09f61ee806060458.jpg

f.call({id:2})( )( )就是继续调用上图中返回的函数,即执行 console.log("id",this.id)。

通过图2可知,要沿着作用域往外查找this,所以最终的this就是foo中的this,因此会打印1:

http://img1.sycdn.imooc.com//climg/611cce540910bbc407090479.jpg

f.call({id:2}) 这句代码,虽然传了参数{id:2},但是f是箭头函数,没有this,所以call中的参数并不会起到作用。

其余几个式子,同  var  t1=f.call(  {id:2}  )()() 类似,同学自己分析一下,如果哪里不懂,可以再次提问,老师再为你解答。

祝学习愉快!

  • 确实有些绕,不过只要记住非箭头函数的this指向和在哪调用没关系,之和谁在调用有关;箭头函数没有自己的this,判断箭头函数的this指向就转化成通过函数作用域链小外层寻找的过程。

    这个题里:

    var f = foo.call( { id: 1 } );  // 是非箭头函数,它的this指向  { id: 1 }

    其余 t1 到 t3 都是在 f 的基础上调用的,例如:var t1 = f.call(  {id:2}  )()()

    他们都是箭头函数,又在 f  的内部,由箭头函数this指向和作用域链可快速判断,它们仨的this指向都是 f  的this指向。

    2021-12-21 16:56:09
  • 同学你好,理解的是对的,赞!

    2021-12-21 17:20:57
  • 多谢夸奖^_^

    2021-12-22 09:32:28
问题已解决,确定采纳
还有疑问,暂不采纳

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

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

0 星
请稍等 ...
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

在线咨询

领取优惠

免费试听

领取大纲

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