Skip to content

函数

函数是 JavaScript 最核心的抽象之一。它既可以封装逻辑,也可以作为值传递、返回和组合,因此函数在 JavaScript 里不只是“代码片段”,更是一等公民。

函数是什么

可以先把函数理解为“可调用的对象”。

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

console.log(typeof sum) // function

函数可以:

  • 被声明
  • 被赋值给变量
  • 作为参数传入
  • 作为返回值返回

这也是闭包、高阶函数、回调函数这些能力成立的前提。

常见定义方式

函数声明

js
function sayHi() {
  console.log('hi')
}

函数表达式

js
const sayHi = function () {
  console.log('hi')
}

箭头函数

js
const sayHi = () => {
  console.log('hi')
}

函数是一等公民

函数可以像普通值一样被赋值和传递。

js
function greet() {
  console.log('hello')
}

const fn = greet

fn()
greet()

这里 fngreet 引用的是同一个函数对象。

参数

默认参数

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

console.log(multiply(5)) // 5

剩余参数

js
function sum(...nums) {
  return nums.reduce((total, n) => total + n, 0)
}

console.log(sum(1, 2, 3)) // 6

arguments

普通函数内部可以通过 arguments 读取实参列表。

js
function foo(a, b) {
  console.log(arguments.length)
  console.log(arguments[0])
}

foo(1, 2)

arguments 的特点:

  • 是类数组,不是真数组
  • 可以通过下标访问
  • length
  • 没有完整数组方法

箭头函数和 arguments

箭头函数没有自己的 arguments

js
const foo = (...args) => {
  console.log(args)
}

所以在现代代码里,如果只是为了拿到不定参数,通常优先使用剩余参数 ...args

普通函数和箭头函数的区别

this

  • 普通函数:this 由调用方式决定
  • 箭头函数:没有自己的 this,使用外层词法作用域中的 this

参数列表对象

  • 普通函数:有自己的 arguments
  • 箭头函数:没有自己的 arguments

new

  • 普通函数:通常可以作为构造函数
  • 箭头函数:不能通过 new 调用

函数和相关专题的关系

当前模块里,函数相关知识已经拆成多页:

  • 闭包:/web/core/ecmascript/function/closure
  • 高阶函数:/web/core/ecmascript/function/higher-order-function
  • this/web/core/ecmascript/object/this

当前页更适合作为函数主题的入口页,负责建立最基本的函数认知。

基于 MIT 许可发布