简约明亮 2022-08-07 11:00 采纳率: 68.8%
浏览 29
已结题

关于this指向的面试题

想问的问题是这个this指向的面试题中第三个person.foo2()的结果为什么是person1呢,为什么往上层作用域查找后的this指向person1呢?请详细解答一下

var name = 'window'
function Person(name) {
this.name = name
this.foo1 = function() {
console.log(this.name)
}
this.foo2 = () => console.log(this.name)
this.foo3 = function() {
return function() {
console.log(this.name)
}
}
this.foo4 = function() {
return ()=>{
console.log(this.name)
}
}
}

var person1 = new Person('person1')
var person2 = new Person('person2')

person1.foo1()
person1.foo1.call(person2)

person1.foo2()
person1.foo2.call(person2)

person1.foo3()()
person1.foo3.call(person2)()
person1.foo3().call(person2)

person1.foo4()()
person1.foo4.call(person2)()
person1.foo4().call(person2)

面试题三主要考察的是new绑定this的指向

person1.foo1(): person1对象调用,隐式绑定,this指向person1,所以输出person1
person1.foo1.call(person2): 有person1调用,隐式绑定,但是person2的call方法的显式绑定优先级更高,所以输出person2
person1.foo2(): person1对象调用foo2,foo2是箭头函数没有this,从上层作用域查找,函数是有作用域的,与面试题二中的第三题不同,所以是隐式绑定,输出person1
person1.foo2.call(person2): 尽管使用call方法试图显式绑定person2,但foo2是箭头函数没有this,还是用的隐式绑定,输出person1
person1.foo3()(): 调用了foo3,返回了一个方法,又执行了,是独立函数调用,默认绑定,输出window
person1.foo3.call(person2)(): person1的foo3用call显式绑定了person2,但是独立函数调用,默认绑定,输出window
person1.foo3().call(person2): person1.foo3()直接执行了,再显式绑定,this指向的就是person2,输出person2
person1.foo4()(): person1先执行了foo4,返回的是一个箭头函数,没有this,需要从上层作用域找,隐式绑定person1,输出person1
person1.foo4.call(person2)(): 给foo4这个函数显式绑定了person2,再执行这个函数,执行的是箭头函数,没有this,从上层作用域找,找的是先前绑定的person2,输出person2
person1.foo4().call(person2): 执行foo4,使用隐式绑定person1,因为执行的函数是箭头函数,所以后面的显式绑定person2不生效,输出person1

想问的问题是第三个person.foo2()的结果为什么是person1呢,为什么往上层作用域查找后的this指向person1呢?请详细解答一下

  • 写回答

1条回答 默认 最新

  • xuxuxu0 2022-08-07 11:14
    关注

    同问?如何解决?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 8月30日
  • 已采纳回答 8月22日
  • 创建了问题 8月7日

悬赏问题

  • ¥30 关于<main>标签页面跳转的问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系
  • ¥30 VMware 云桌面水印如何添加
  • ¥15 用ns3仿真出5G核心网网元
  • ¥15 matlab答疑 关于海上风电的爬坡事件检测
  • ¥88 python部署量化回测异常问题
  • ¥30 酬劳2w元求合作写文章
  • ¥15 在现有系统基础上增加功能
  • ¥15 远程桌面文档内容复制粘贴,格式会变化