Open homobulla opened 6 years ago
这y一part主要的分析箭头函数下的this问题。 在箭头函数下,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,对象里有两个方法:printOne和printTwo,其中printOne是箭头函数. 箭头函数本身与printOne平级以key:value的形式,也就是箭头函数本身所在的对象为obj.其父级就是window.换句话说,printOne在定义时,其scope中存的执行期上下文是GO。 console.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.
printOne
printTwo
key:value
window
scope
GO
console.log(this.a);
this.a
a
console.log(a)
下一part将call 和apply 以及bind中的this,同时自己实现bind函数。
这y一part主要的分析箭头函数下的
this
问题。 在箭头函数下,this
是在定义时也就是函数申明时被确定的,它继承了其父的执行期上下文。首先我们定义一个对象obj,对象里有两个方法:
printOne
和printTwo
,其中printOne
是箭头函数. 箭头函数本身与printOne
平级以key:value
的形式,也就是箭头函数本身所在的对象为obj.其父级就是window
.换句话说,printOne
在定义时,其scope
中存的执行期上下文是GO
。console.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函数。