07箭头函数中的this
- 箭头函数中this是在定义函数的时候绑定的,而不是在执行函数的时候绑定
- 箭头函数中,this指向的固定化,并不是因为箭头函数内部有绑定this的机制,实际是箭头函数根本没有自己的this,导致内部的this就是外层代码块的this,所以也就不能用作构造函数
- 加粗句子理解:this是继承自父执行上下文中的this,比如这里的箭头函数中的this.name,箭头函数本身与say平级以key:value的形式,也就是箭头函数本身所在的对象为b,而b的父执行上下文就是window,因此这里的this.x实际上表示的是window.x,因此输出的是111。
- 执行上下文:描述js的代码执行环境(当前执行代码中片段的变量,函数,作用域链等)
- js采用栈的方式对执行上下文进行管理
var name = 111;
var b = {
name:222,
say: ()=> { //say里的函数进栈,创建执行上下文,this继承父执行上下文中的this,也就是b所在的全局上下文(window)
console.log(this.name)
}
}
b.say() //111
- 简单代码测试
var name = 111;
function xxx() {
console.log(this) //xxx()函数直接调用返回window
return {
name:333,
say: function () { //xxx()返回一个对象
console.log(this) //.say()对象调用方法,this指向该对象
return ()=>{ //.say()返回一个箭头函数 ,其父执行上下文就是say属性的最外层函数function () {...}
console.log(this.name)//function () {...}其this对象本身就被调整成了xxx()返回的对象 333
return function (){//.say()()返回一个匿名函数
console.log(this.name)//匿名函数自调用(匿名函数的执行环境是全局作用域,window) 111
}
}
}
}
}
xxx().say()()()
let a = {
name:444,
test:xxx().say() //333 箭头函数this指向不能改变 如果是一般函数声明是444
}
a.test()()
- 在事件中使用this
let element = document.querySelector('.q');
element.onclick = ()=>{ //element的父执行上下文是window
console.log(this)
}
element.addEventListener('click',function (){ //本身由element节点对象进行调用
console.log(this)
})
-
this指向的三种情况
-
obj.fun() fun 中的 this->obj ,自动指向.前的对象
-
new Fun() Fun 中的 this->正在创建的新对象,new 改变了函数内部的 this 指向,导致 this 指向实例化 new 的对象
-
fun() 和匿名函数自调 this 默认->window,函数内部的 this,this 默认是指向 window 的
-