首先箭头函数没有this
注:严格模式和非严格模式会有差别
基本概念
引用自MDN:在绝大多数情况下,函数的调用方式决定了this的值(运行时绑定)。this不能在执行期间被赋值,且在每次函数被调用时this的值也可能会不同。ES5引入了bind方法来设置函数的this值,而不用考虑如何被调用的。ES6引入箭头函数,箭头函数不提供自身的this绑定(this的值将保持为闭合词法上下文的值)。
非严格模式下:this总是指向一个对象
在严格模式下:可以是任意值
描述
this的值取决于它出现的上下文:函数、类或全局。
函数上下文
在函数内部,this的值取决于函数被如何调用。可以将this看做是函数的一个隐藏参数(就像函数定义中的声明的参数一样),this是语言在函数体被执行时为你创建的绑定。
对于典型的函数,this的值是函数被访问的对象。换句话说,如果函数调用的形式是obj.f(),那么this就指向obj。
const obj = {a:'1'}
obj.f = function getThis(){
console.log(this)
}
obj.f()
此时this指向obj
构造函数
当一个函数被用作构造函数(new关键字)时,无论构造函数是在哪个对象上被访问,this都会被绑定到正在构造的新对象上。除非构造函数返回另一个非原始值,不然this的值会成为new表达式的值。
function C() {
this.a = 37;
}
let o = new C();
console.log(o.a); // 37
function C2() {
this.a = 37;
return { a: 38 };
}
o = new C2();
console.log(o.a); // 38
在C2中,因为构造过程中返回了一个对象,this被绑定的新对象被丢弃。