主题
函数
函数是 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()这里 fn 和 greet 引用的是同一个函数对象。
参数
默认参数
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)) // 6arguments
普通函数内部可以通过 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
当前页更适合作为函数主题的入口页,负责建立最基本的函数认知。
