正在回答
同学你好,解答如下:
整个代码,只有foo是普通的函数,而foo中返回的函数都是箭头函数(图一):

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

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

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

先看 var t1=f.call( {id:2} )( )( )这句代码:
f.call( {id:2} )是调用图四中的函数,因此f.call( {id:2} )的值就是下图中选中的函数:

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

f.call({id:2})( )( )就是继续调用上图中返回的函数,即执行 console.log("id",this.id)。
通过图2可知,要沿着作用域往外查找this,所以最终的this就是foo中的this,因此会打印1:

而f.call({id:2}) 这句代码,虽然传了参数{id:2},但是f是箭头函数,没有this,所以call中的参数并不会起到作用。
其余几个式子,同 var t1=f.call( {id:2} )()() 类似,同学自己分析一下,如果哪里不懂,可以再次提问,老师再为你解答。
祝学习愉快!

恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星