homobulla / javascript-book

读书笔记
0 stars 0 forks source link

this #8

Open homobulla opened 6 years ago

homobulla commented 6 years ago

这y一part主要的分析箭头函数下的this问题。 在箭头函数下,this是在定义时也就是函数申明时被确定的,它继承了其父的执行期上下文。

var a = 11;
var obj = {
    a: '22',
    printOne: ()=>{
        console.log(this.a);
        console.log(a)
    },
    printTwo: function(){
        console.log(this.a);
        console.log(a)
    }
}
obj.printOne();
obj.printTwo();

首先我们定义一个对象obj,对象里有两个方法:printOneprintTwo,其中printOne是箭头函数. 箭头函数本身与printOne平级以key:value的形式,也就是箭头函数本身所在的对象为obj.其父级就是window.换句话说,printOne在定义时,其scope中存的执行期上下文是GOconsole.log(this.a);中的this.a 就是GO中定义的a变量。 console.log(a)中的a,printOne函数在执行前的一刻,形成自己的AO,AO内并没有变量a,所以顺着执行期上下文的链往下找,直到找到了GO中定义的a。 而在printTwo中,this则是谁调用则指向谁,当obj调用printTwo调用printTwo时,函数内的this就指向了obj对象,于是输出obj内部的this.

下一part将call 和apply 以及bind中的this,同时自己实现bind函数。