面试官又在问“四种调用模式”了

207 阅读3分钟

调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每个函数接收两个附加的参数: this 和arguments。参数this在面向对象编程中非常重要,它的值取决于调用的模式。在JavaScript中-共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式和apply调用模式。搞清楚这些模式的运用特点,与如何初始化关键参数this上存在差异非常重要。

下面就让小编以非常简单的示例让你轻松了解四种调用模式吧!

方法调用模式

方法调用模式是指函数被作为对象的方法来调用。这是 JavaScript 中最常见的一种调用模式,它通常用于实现对象的行为。

运用场景: 当需要在对象内部操作对象的属性时,通常使用方法调用模式。

示例:

let person = {
  name: 'John',
  greet: function() {
    return 'Hello, ' + this.name;
  }
};

console.log(person.greet()); // 输出 "Hello, John"

在这个例子中,greet 方法被调用时,this 指向了 person 对象,因此可以访问 person 对象的 name 属性。

函数调用模式

函数调用模式是指函数直接被调用,而不是作为对象的方法。在函数调用模式中,this 指向全局对象(在浏览器中通常是 window 对象)。

运用场景: 当需要在函数内部执行一些操作,而不依赖于特定对象的属性时,通常使用函数调用模式。

示例:

function greet() {
  return 'Hello, ' + this.name;
}

let person = {
  name: 'John'
};

console.log(greet()); // 输出 "Hello, undefined"

在这个例子中,由于 greet 函数直接被调用,而没有通过对象的属性调用,因此 this 指向了全局对象(在浏览器中通常是 window 对象)。因为全局对象中没有 name 属性,所以输出为 "Hello, undefined"。

构造器调用模式

构造器调用模式是指函数被用作构造器来创建新的对象。在构造器调用模式中,this 指向了新创建的对象。

运用场景: 当需要创建多个相似对象时,通常使用构造器调用模式。

示例:

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

let person = new Person('John');
console.log(person.name); // 输出 "John"

在这个例子中,Person 函数被用作构造器,通过 new 关键字创建了一个新的 person 对象。在构造器内部,this 指向了新创建的对象,因此将 name 属性赋值给了新对象。

apply 调用模式

apply 调用模式是指函数通过 apply 方法来调用,并且可以显式指定 this 的值。apply 方法接收两个参数:第一个参数是要绑定的 this 值,第二个参数是一个数组,包含了传递给函数的参数。

运用场景: 当需要动态地指定函数执行时的 this 值,或者传递一个参数数组给函数时,通常使用 apply 调用模式。

示例:

function greet() {
  return 'Hello, ' + this.name;
}

let person = {
  name: 'John'
};

console.log(greet.apply(person)); // 输出 "Hello, John"

在这个例子中,greet 函数通过 apply 方法被调用,传入了 person 对象作为 this 的值,因此 this 指向了 person 对象。

参数 arguments

arguments 是一个类数组对象,它包含了函数调用时传递的所有参数。虽然 arguments 不是一个真正的数组,但它可以像数组一样使用索引访问参数。

运用场景: 当函数需要接收不定数量的参数时,或者需要处理不确定数量的参数时,可以使用 arguments 对象。

示例:

function sum() {
  let result = 0;
  for (let i = 0; i < arguments.length; i++) {
    result += arguments[i];
  }
  return result;
}

console.log(sum(1, 2, 3)); // 输出 6
console.log(sum(4, 5, 6, 7)); // 输出 22

结语

JavaScript 中的四种调用模式各有其特点和适用场景。了解它们的基本原理和运用场景,对于编写优雅的 JavaScript 代码非常重要。同时,掌握 arguments 对象的使用也是提高函数灵活性的关键。希望本文能够帮助你更好地理解 JavaScript 中的函数调用机制!