返回

揭秘JavaScript函数的调用方式与传参技巧——史上最全指南

前端

在JavaScript的世界里,函数是一等公民,既可以作为独立的个体存在,也可以作为参数传递给其他函数,甚至可以作为返回值返回。这使得JavaScript函数拥有极高的灵活性,能够满足各种复杂的编程需求。

函数的四种调用模式

在JavaScript中,函数有四种调用模式,分别是:

  • 函数调用形式
  • 方法调用形式
  • 构造器形式
  • apply和call调用形式

函数调用形式

函数调用形式是最简单的调用方式,直接使用函数名加参数的方式调用函数,例如:

function sum(a, b) {
  return a + b;
}

var result = sum(1, 2);

这种调用方式下,函数内部的this指向window对象(在严格模式下为undefined)。

方法调用形式

方法调用形式与函数调用形式类似,只是将函数作为对象的方法来调用,例如:

var obj = {
  sum: function(a, b) {
    return a + b;
  }
};

var result = obj.sum(1, 2);

这种调用方式下,函数内部的this关键字指向该对象本身。

构造器形式

构造器形式用于创建对象,通过使用new关键字调用函数,例如:

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

var person = new Person('John', 30);

这种调用方式下,函数内部的this关键字指向新创建的对象。

apply和call调用形式

apply和call调用形式允许我们显式地指定函数内部的this关键字,语法如下:

func.apply(thisArg, argsArray);
func.call(thisArg, arg1, arg2, ...);

其中,thisArg指定函数内部的this关键字指向的对象,argsArray是一个包含参数的数组。

例如,我们可以使用apply和call调用形式来模拟函数的继承,例如:

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

function Child(name, age) {
  Parent.apply(this, [name]);
  this.age = age;
}

var child = new Child('John', 30);

这种调用方式下,Child函数内部的this关键字指向child对象,Parent函数内部的this关键字指向Parent对象。

函数传参技巧

在JavaScript中,函数参数的传递方式是传值,即函数内部对参数的修改不会影响函数外部的变量。

但是,我们可以通过使用对象或数组作为参数来实现传引用,例如:

function add(arr) {
  arr.push(3);
}

var arr = [1, 2];
add(arr);
console.log(arr); // [1, 2, 3]

这种情况下,函数内部对arr的修改会影响函数外部的变量。

此外,我们还可以使用闭包来实现函数之间的传参,例如:

function outer() {
  var a = 1;

  function inner() {
    console.log(a); // 1
  }

  return inner;
}

var innerFunc = outer();
innerFunc();

这种情况下,inner函数内部可以访问outer函数内部的变量a。

经典面试题

JavaScript函数的调用方式和传参技巧是经常出现在面试中的考察点,这里列举几个经典的面试题:

  • 如何让函数内部的this关键字指向指定的