调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每个函数接收两个附加的参数: 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 中的函数调用机制!