返回

一探究竟:THIS(一、二),见微知著,洞悉关联

前端

THIS —— 函数执行的主体

在计算机程序中,函数是代码复用的基本单元,通过函数调用,我们可以将复杂的任务分解成更小的可管理的部分,从而提高代码的可读性和可维护性。那么,在函数执行过程中,是谁将函数体中的代码付诸实践呢?答案就是THIS所代表的执行主体。

THIS关键字指向函数被调用的对象,它是函数执行的上下文,决定了函数体中代码的执行方式和访问权限。在大多数情况下,THIS指向调用函数的对象,例如:

const person = {
  name: "John",
  age: 30,
  greet: function() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
};

person.greet(); // Output: Hello, my name is John and I am 30 years old.

在这个例子中,person.greet()方法被调用,此时THIS指向person对象,因此this.namethis.age分别指向John30

THIS在内存中的表现

为了更好地理解THIS关键字,我们还需要了解函数在内存中的存储和执行方式。

当函数被定义时,它会被存储在堆内存中,成为一个函数对象。函数对象包含函数体中的代码,以及一些其他信息,例如函数名和参数列表。

当函数被调用时,会在栈内存中创建一个新的执行上下文,用于存储函数的参数和局部变量。执行上下文还包含对函数对象的引用,因此THIS关键字可以访问函数对象中的属性和方法。

函数调用时THIS的自动获取

当函数被调用时,THIS关键字会自动获取调用该函数的对象作为其值。这使得我们可以在函数体中访问调用函数的对象的属性和方法,而无需显式地传递参数。

例如,在下面的代码中,greet()方法被person对象调用,因此THIS指向person对象:

const person = {
  name: "John",
  age: 30,
  greet: function() {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
  }
};

person.greet(); // Output: Hello, my name is John and I am 30 years old.

参数和局部变量对THIS的影响

在函数体中,我们可以使用参数和局部变量来访问函数的参数和局部变量。但是,参数和局部变量对THIS关键字没有影响。

例如,在下面的代码中,greet()方法接受一个name参数,并在函数体中使用该参数。但是,THIS关键字仍然指向调用函数的对象:

const person = {
  name: "John",
  age: 30,
  greet: function(name) {
    console.log(`Hello, my name is ${this.name} and I am ${this.age} years old. My friend's name is ${name}.`);
  }
};

person.greet("Mary"); // Output: Hello, my name is John and I am 30 years old. My friend's name is Mary.

结语

THIS关键字是JavaScript中一个非常重要的概念,理解THIS关键字对于理解函数的执行过程和访问权限至关重要。通过本文的介绍,相信您已经对THIS关键字有了更深入的了解。