解读 (JavaScript 深入之从 ECMAScript 规范解读 this )
2023-11-29 21:58:27
给 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)的概念。