JavaScript函数的四种调用模式详解

作者:小括号

时间:2026-10-30

浏览:550

本文深入解析JavaScript中函数的四种调用模式:函数调用、方法调用、构造器调用以及apply/call调用。重点阐述不同模式下this关键字的指向差异,并通过示例说明如何利用call和apply动态改变上下文,实现方法复用及类数组对象转换。

文章目录

JavaScript函数调用模式概述

在JavaScript中,函数的调用模式主要分为四种,理解这些模式对于掌握代码行为至关重要。本文将重点区分作为普通函数直接调用的模式,并对比其他三种常见的调用方式。

方法调用模式

第一种是方法调用模式。当函数被赋值给对象的属性,并通过该对象进行调用时,即为方法调用。此时,函数内部的this关键字指向调用该方法的对象。


var obj={
 fun1: function(){
  //方法内容
  this; //指的是window
 }
}

obj.fun1() //方法的调用

构造器调用模式

第二种是构造器调用模式。当使用new关键字调用函数时,JavaScript会创建一个新对象,并将该对象绑定到函数内部的this上。这种模式常用于创建具有相同属性和方法的多个对象实例。


function Person(name, age, job){
 this.name = name;
 this.age = age;
 this.job = job;
 this.sayName = function(){
  alert(this.name);
 };
}
var person1 = new Person("Nicholas", 29, "Software Engineer");
var person2 = new Person("Greg", 27, "Doctor");

apply与call调用模式

第三种是apply或call调用模式。这两种方法允许我们显式地指定函数执行时的this值,从而改变函数的上下文环境。它们通常用于借用其他对象的方法或动态绑定this。


function cat(){}
cat.prototype = {
 food: "fish",
 say: function(){
  alert("I love " + this.food);
 }
};

var blackCat = new cat; 
blackCat.say();

在构造器调用中,如果函数没有显式的return语句,那么新创建的对象会被隐式返回,并作为构造函数的结果。这意味着var blackCat = new cat();与直接调用构造器并返回新对象的效果等价。然而,如果我们需要处理一个已存在的对象,情况会有所不同。


var whiteDog = {
 food: "bone"
}; 

假设我们有一个对象whiteDog,但不想重新定义其say方法。此时,我们可以利用call或apply方法,借用blackCat对象的say方法来操作whiteDog。例如:blackCat.say.call(whiteDog)。这表明,call和apply的核心作用在于动态改变this的指向。当一个对象缺少某个方法,而另一个对象拥有该方法时,我们可以通过call或apply来借用该其他对象的方法进行操作。

在实际开发中,一个常见的应用场景是将类数组对象转换为真正的数组。例如,通过document.getElementsByTagName获取的DOM节点集合是一个类似数组的对象(arguments也是),但它不具备Array原型上的push、pop等方法。我们可以利用Array.prototype.slice.call将这类对象转换为真正的数组:var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));。转换后,domNodes变量就可以使用Array的所有内置方法了。

综上所述,掌握JavaScript的四种调用模式及其对this的影响,对于编写清晰、高效的代码至关重要。希望本文的内容能对您的学习有所帮助,欢迎继续支持本站获取更多技术分享。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章