第一题
let person = {
username: "person",
sayName: function () {
console.log(this);
},
};
function sayName() {
let sss = person.sayName;
sss(); //指向哪里?
person.sayName(); //this指向哪里
person.sayName(); //this指向哪里
(b = person.sayName)(); //this指向哪里
}
sayName();
- 第二题
let person1 = {
name: "person1",
foo1: function () {
console.log(this);
},
foo2: () => console.log(this),
foo3: function () {
return function () {
console.log(this);
};
},
foo4: function () {
return () => {
console.log(this.name);
};
},
};
let person2 = {
name: "person2",
};
person1.foo1(); //this指向 person1
person1.foo1.call(person2); //this指向 显示绑定大于隐式绑定,指向person2
person1.foo2(); //this指向 箭头函数中没有this,在上层作用域查找,window
person1.foo2.call(person2); //this指向 箭头函数没有this,显示绑定不生效,window
person1.foo3()(); //this指向 独立调foo3返回的函数,指向window
person1.foo3.call(person2)(); //this指向 给foo3的函数显示绑定,之后再单独执行foo3返回函数,默认绑定,window
person1.foo3().call(person2); //this指向 先执行foo3函数,返回一个匿名函数,将匿名函数显式绑定,person2
person1.foo4()(); //this指向 先对foo4隐式绑定peson1,再执行箭头函数 person1
person1.foo4.call(person2)(); //this指向 先给foo4显示绑定person2,再执行foo4中返回的匿名函数,匿名函数向上查找,person2
person1.foo4().call(person2); //this指向 先执行foo4,返回箭头函数,再给箭头函数显示绑定,不生效 person1