函数

js/function2026-08-24 19:46:25

函数 是 JavaScript 中的基本组件之一。JavaScript 中的函数类似于过程——一组执行任务或计算值的语句。但要成为函数,这个过程应该接受输入并返回与输入存在某些明显关系的输出。

要使用一个函数,你必须将其定义在你希望调用它的作用域内。

JavaScript 中的函数均为 Function 对象。

定义函数

可以通过以下几种方式来定义函数,这些方法都会返回一个 Function 对象:

函数声明语句

一个函数定义(也称为函数声明,或函数语句)由 function 关键字,并跟随以下部分组成:

  • 函数名称(作为 Function 对象的变量名)。
  • 函数参数列表,包围在括号中并由逗号分隔。
  • 定义函数的 JavaScript 语句,用大括号括起来,{ /* … */ }。
function square(number) {
  return number * number;
}

JavaScript 解释器会将整个函数声明提升到当前作用域的顶部,称为 函数提升。

函数声明表达式

函数声明表达式与函数声明语句类似,区别是 function 不是出现在语句开头:

const factorial = function fac(n) {
  return n < 2 ? 1 : n * fac(n - 1);
};

函数声明表达式可以不指定函数名称定义匿名函数:

const square = function (number) {
  return number * number;
};

函数提升仅适用于函数声明,而不适用于函数表达式。

使用 Function 构造函数

使用 Function 类的构造函数也可以定义函数。

const sum = new Function('a', 'b', 'return a + b');

箭头函数表达式

箭头函数表达式相比函数表达式具有较短的语法,且没有它自己的 this、arguments、super 和 new.target。箭头函数总是匿名的。

const materials = ['Hydrogen', 'Helium', 'Lithium', 'Beryllium'];

console.log(materials.map((material) => material.length));
// Expected output: Array [8, 6, 7, 9]

参数

在定义的函数体内,可以使用参数名读取所传递的参数。

参数的按值传递

参数本质上是按值传递给函数的。

即使函数体的代码为传递给函数的参数赋了新值,这个改变也不会反映到全局或调用该函数的代码中。

如果你将对象作为参数传递,而函数改变了这个对象的属性(而不是对象本身),这样的改变对函数外部是可见的。

默认参数

在 JavaScript 中,函数参数的默认值是 undefined。通过下面的语法可以手动设定将参数的默认值:

function multiply(a, b = 1) {
  return a * b;
}

剩余参数

剩余参数语法允许将不确定数量的参数表示为数组:

function multiply(multiplier, ...theArgs) {
  return theArgs.map((x) => multiplier * x);
}

const arr = multiply(2, 1, 2, 3);
console.log(arr); // [2, 4, 6]

arguments 对象

函数的实际参数会被保存在一个类似数组的 arguments 对象中。

在函数内,你可以按如下方式找出传入的参数:

arguments[i];

其中 i 是参数的序号,从 0 开始。所以第一个传入函数的参数会是 arguments[0]。参数的数量由 arguments.length 表示。

arguments.callee 数据属性包含 arguments 所属的当前正在执行的函数。(即将废弃)

返回值

使用 return 语句终止函数执行,并指定要返回给调用函数的值。

return;
return expression;

如果省略待返回其值的表达式,则返回 undefined。

如果没有 return 语句,则在函数运行结束后返回 undefined。

如果在 try 块内执行了 return 语句,它会首先执行 finally 块然后才实际返回值(如果存在)。

调用函数

定义的函数并不会自动执行它。定义了函数仅仅是赋予函数以名称并明确函数被调用时该做些什么。调用函数 才会以给定的参数真正执行这些动作。

普通调用

通过函数名称加上括号 () 来调用函数,括号内填写参数的值。

square(5);

函数体内可以调用函数本身。

只能调用作用域内的函数。(参见作用域)

通过 Function 对象的方法也可以实现函数的调用。(参见 Function 对象)

在函数定义表达式后加上 () 可以定义后立即调用函数,不过由于 function 开头会被当作函数声明语句,所以一般采用以下写法:

//第一种:用括号把整个函数定义和调用包裹起来
(function(){
   
 //function body
}())

//第二种:用括号把函数定义包裹起来,后面再加括号
(function (){
   
 //function body
})()

当作构造函数调用

当使用 new 关键字调用函数时,会将函数作为构造函数来创建一个新的对象实例。

详见构造函数条目。

参考

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Functions

本页目录