var name = 'window'
function Person (name) {
this.name = name
this.obj = {
name: 'obj',
// 此时foo1,foo2的上层作用域为obj对象
foo1: function () {
return function () {
console.log(this.name)
}
},
foo2: function () {
return () => {
console.log(this.name)
}
}
}
}
var person1 = new Person('person1')
var person2 = new Person('person2')
person1.obj.foo1()() // window (person1.obj.foo1()得到返回函数后直接调用,this指向全局对象)
person1.obj.foo1.call(person2)() // window (还是直接调用,this指向全局对象)
person1.obj.foo1().call(person2) // person2 (person1.obj.foo1()这句话得到返回函数后,使用显示调用绑定person2,this指向person2)
person1.obj.foo2()() // obj (person1.obj.foo2()这句话得到返回函数后调用,但是箭头函数没有this,向上一层作用域找,上一层作用域为foo2函数,foo2是被obj对象调用的,所以this指向obj对象)
person1.obj.foo2.call(person2)() // person2 (person1.obj.foo2.call(person2)将foo2的上层作用域指向了person2,再进行调用的时候,上一层作用域就是person2)
person1.obj.foo2().call(person2) // obj (person1.obj.foo2()的到返回函数,使用显示绑定call无效,上一层作用域为foo2函数,foo2是被obj对象调用的,所以this指向obj对象)
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.