返回

解读 (JavaScript 深入之从 ECMAScript 规范解读 this )

前端

给 JavaScript 的 (this) = { }换个角度理解方式 ( JavaScript 深入之从 ECMAScript 规范解读 this )
导语
(this)是JavaScript中一个非常重要的概念。它既可以指向调用函数的对象,也可以指向全局对象。对于初学者来说,理解(this)可能会有些困难。但在本文中,我们将从ES规范的角度出发,深入剖析(this)的指向和行为,以帮助读者更好地理解(this)的概念。

ES5中(this)的指向
在ES5中,(this)的指向主要由函数的调用方式决定。一般来说,(this)指向调用函数的对象。例如:

function Person(name) {
  this.name = name;
}

const person = new Person('John');

console.log(person.name); // John

在这个例子中,new Person('John')调用Person函数,因此(this)指向person对象。person.name则访问了person对象的name属性,输出结果为"John"。

函数内部的(this)
当函数被另一个函数调用时,内部函数的(this)指向可能发生改变。例如:

const person = {
  name: 'John',
  greet: function() {
    console.log(this.name);
  }
};

setTimeout(person.greet, 1000); // undefined

在这个例子中,setTimeout函数调用了person.greet方法。但是,由于setTimeout函数不是person对象的方法,因此内部函数greet的(this)指向了全局对象window,而不是person对象。因此,console.log(this.name)输出undefined。

箭头函数的(this)
在ES6中,箭头函数的(this)指向与普通函数的(this)指向不同。箭头函数的(this)总是指向定义它的上下文的(this)。例如:

const person = {
  name: 'John',
  greet: () => {
    console.log(this.name);
  }
};

setTimeout(person.greet, 1000); // John

在这个例子中,person.greet是一个箭头函数。因此,内部函数greet的(this)指向了person对象,而不是全局对象window。因此,console.log(this.name)输出"John"。

结语
(this)是JavaScript中一个非常重要的概念。它既可以指向调用函数的对象,也可以指向全局对象。对于初学者来说,理解(this)可能会有些困难。但在本文中,我们从ES规范的角度出发,深入剖析了(this)的指向和行为,以帮助读者更好地理解(this)的概念。