JS面试题-有关this指向的四个有关面试题
this绑定的四条规则的优先级
一般要解决this指向问题,要先了解这四条this的指向规则。
1.默认规则的优先级最低
毫无疑问,默认规则的优先级是最低的,因为存在其他规则时,就会通过其他规则的方式来绑定this
2.显示绑定优先级高于隐式绑定
3.new绑定优先级高于隐式绑定
4.new绑定优先级高于bind
new绑定和call、apply是不允许同时使用的,所以不存在谁的优先级更高 new绑定可以和bind一起使用,new绑定优先级更高
面试题
一、
var name = "window"; var person = { name: "person", sayName: function () { console.log(this.name); } }; function sayName() { var sss = person.sayName; sss(); // window:独立函数调用 person.sayName(); // person:隐式调用 (person.sayName)(); // person:隐式调用 (b = person.sayName)(); // window:赋值表达式(独立函数调用) } sayName();
二、
var name = window var person1 = { name: person1, foo1: function () { console.log(this.name) }, foo2: () => console.log(this.name), foo3: function () { return function () { console.log(this.name) } }, foo4: function () { return () => { console.log(this.name) } } } var person2 = { name: person2 } person1.foo1(); // person1 默认绑定 person1.foo1.call(person2); // person2 call显示绑定大于隐式绑定 person1.foo2(); // undefined 箭头函数没有this,指向全局 person1.foo2.call(person2); // undefined 同上,箭头函数无this person1.foo3()(); // undefined 独立函数调用 person1.foo3.call(person2)(); // undefined 独立函数调用 person1.foo3().call(person2); // person2 返回的函数显示绑定person2 person1.foo4()(); // person1 原因不再解释 person1.foo4.call(person2)(); // person2 上层作用域显示绑定了person2 person1.foo4().call(person2); // person1 向上找到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 person1.foo1.call(person2) // person2(显示高于隐式绑定) person1.foo2() // person1 (上层作用域中的this是person1) person1.foo2.call(person2) // person1 (上层作用域中的this是person1) person1.foo3()() // window(独立函数调用) person1.foo3.call(person2)() // window person1.foo3().call(person2) // person2 person1.foo4()() // person1 person1.foo4.call(person2)() // person2 person1.foo4().call(person2) // person1
四、
var name = window function Person (name) { this.name = name this.obj = { name: 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.call(person2)() // window person1.obj.foo1().call(person2) // person2 person1.obj.foo2()() // obj person1.obj.foo2.call(person2)() // person2 person1.obj.foo2().call(person2) // obj
上一篇:
Java基础知识总结(2021版)
下一篇:
前端笔试题总结(this指向问题)