聊聊this

74 阅读4分钟

在JavaScript中,this是一个极为重要的关键字,用于访问对象的属性和方法。它的值取决于它所在的执行上下文,而JavaScript的多种编程范式和语言特性使得this的行为有时令人感到困惑。让我们深入探讨一下this的各种情况:

一、让人头痛的this

  1. 全局上下文中的this

在全局上下文中,this指向全局对象。在浏览器环境中,全局对象是window对象;在Node.js环境中,则是global对象。需要注意的是,在严格模式下,this为undefined。

console.log(this === window); // true
  1. 函数上下文中的this

在函数中,this的值取决于函数的调用方式。当函数作为普通函数调用时,this指向全局对象。

function myFunction() { 
console.log(this);
}
​
myFunction(); // 输出全局对象(window或global)

然而,当函数作为对象的方法调用时,this指向调用该方法的对象。

const myObject = {  
myMethod: function() { 
console.log(this);  }};
​
myObject.myMethod(); // 输出myObject对象
  1. 构造函数中的this

当一个函数用作构造函数时,this指向新创建的对象。

function Person(name) {  
this.name = name;}
const person = new Person('张三');
console.log(person.name); // 输出 '张三'
  1. 箭头函数中的this

箭头函数与普通函数不同,它没有自己的执行上下文,而是与所在上下文共享执行上下文。在箭头函数中,this指向函数定义时的上下文。

const myObject = {  myMethod: function() {   
const myArrowFunction = () => {     
console.log(this);    } 
myArrowFunction();  }};
myObject.myMethod(); // 输出myObject对象

箭头函数在定义时捕获所在执行上下文的this值,因此箭头函数的执行上下文中的this与定义时的执行上下文中的this相同。同时,无法使用call()、apply()、bind()方法改变箭头函数中的this指向。

二、改变this的值

有时候,我们需要显式地改变this的值,这时可以使用call()、apply()、bind()方法或new操作符。

1. call()和apply()方法

call()和apply()方法可以改变函数的this值,并立即调用该函数。它们的区别在于传参方式不同,call()方法以逗号分隔参数,apply()方法以数组形式传参。

function myFunction(a, b) {  console.log(this, a, b);}
​
const myObject = {  myProperty: 'Hello'}
​
myFunction.call(myObject, 1, 2); // 输出myObject对象,12myFunction.apply(myObject, [1, 2]); // 输出myObject对象,12

2. bind()方法

bind()方法改变函数的this值,并返回一个新的函数,而不会立即调用它。

function myFunction(a, b) {  console.log(this, a, b);}
const myObject = {  myProperty: 'Hello'}
const boundFunction = myFunction.bind(myObject, 1,2);
boundFunction(); // 输出myObject对象,1,2

3. new绑定

new操作符用于创建一个新的对象,并将构造函数中的this指向该新对象。它执行以下步骤:

1). 创建一个新的空对象。

2). 将该空对象的原型指向构造函数的prototype属性。

3). 将构造函数中的this指向该新对象。

4). 执行构造函数中的代码,并为该新对象添加属性和方法。

5). 返回该新对象。

function Person(name) {  this.name = name;}
const person = new Person('张三');console.log(person.name); 
// 输出 '张三'

在这个例子中,new操作符创建了一个新的对象,并将构造函数Person中的this指向该新对象。构造函数中的this.name = name将新对象的name属性设置为'张三'。最后,new操作返回该新对象,并将其赋值给变量person。

new绑定是一种特殊的方式,它将this指向新创建的对象。在JavaScript中,new操作符是常用的创建新对象并初始化属性和方法的方法。

三、写在最后

JavaScript中的this关键字极其重要,用于访问对象的属性和方法。只有全面理解了this的行为,我们才能更好地使用它,编写出高效且可读性强的JavaScript代码。深入了解this的各种情况和使用方法,将使我们在编程过程中更加游刃有余,避免产生困惑和错误的结果。

代码的解释帮助我们理解每个情况下this的指向和行为。通过阅读和实践,我们将逐渐掌握如何灵活运用this,为我们的JavaScript程序增添更多的功能和可扩展性。让我们一同探索JavaScript中this的奥秘,为我们的编程之旅增添更多的乐趣和挑战!