Javascript中this的指向

81 阅读2分钟

首先箭头函数没有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被绑定的新对象被丢弃。