06this面试题

想要理解this,你可以先记住以下两点:

1:this永远指向一个对象;

2:this的指向完全取决于函数调用的位置;

  • 函数直接调用 fun() === fun.call(window)
  • 函数作为对象方法进行调用 a.say() === a.say.call(a)
  • 一句话就近原则下,谁调用this就指向谁
var name = 222;
    var a = {
        name:111,
        say:function () {
            console.log(this.name)
        }
    }

    var fun = a.say
    fun() //函数直接调用 fun.call(window) //222
    a.say() //函数作为对象方法进行调用 a.say.call(a) //111

    var b = {
        name:333,
        say:function (fn) {
            fn.call(this)//333
            fn() //222 //a.say传入的参数是function () {console.log(this.name)} 函数直接调用fn.call(window)
        }
    }

    b.say(a.say) 
    b.say = a.say //b的say属性指向变为a的say属性的函数
    b.say() //333  b.say.call(b)

补充:

https://zhuanlan.zhihu.com/p/42145138