想问的问题是这个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呢?请详细解答一下