重学JavaScript高级(一):this指向面试题

88 阅读1分钟

第一题

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