Skip to content

this有关的面试题

第一题

js
        let name = "window"
        let person = {
            name: "Person",
            sayName: function () {
                console.log(this.name)  // 
            }
        }
        function sayName() {
            let sss = person.sayName

            sss()  // 绑定:默认绑定,window

            person.sayName() // 绑定:隐式绑定,person

            (person.sayName)() // 绑定:隐式绑定,person

            (b = person.sayName)() // 术语:间接函数引用,window
        }
        sayName()

第二题

js
let name = 'window'

function Person(name) {
    this.name = name
    this.foo1 = function () {
        return function () {
            console.log(this.name)
        }
    },
    this.foo2 = () => console.log(this.name),
    this.foo3 = function () {
        return function () {
            return () => {
                console.log(this.name)
            }
        }
    }
    this.foo4 = function () {
        return () => {
            console.log(this.name)
        }
    }
}

let person1 = new Person('person1')
let person2 = new Person('person2')

person1.foo1() // 隐式绑定:person1
person1.foo1.call(person2) // 显式绑定:person2

person1.foo2() // 上层作用域查找:person1(new绑定)
person1.foo2.call(person2) // 上层作用域查找:person1(箭头函数没有this,call没有意义)

person1.foo3()() // 默认绑定:window(独立函数调用)
person1.foo3.call(person2)() // 默认绑定:window(独立函数调用,person2绑的上层)
personalbar.foo3().call(person2) // 显式绑定:person2


 personalbar1.foo4()() // 上层作用域查找:person1(隐式绑定)
 personalbar.foo4.call(person2)() // 上层作用域查找:person2(显式绑定)
 person1.foo4().call(person2) // 上层作用域查找:person1(隐式绑定)