JavaScript函数基础

JavaScript中,函数是第一类对象(first-class objects)。凡是可以使用值的地方,就能使用函数。比如,可以把函数赋值给变量和对象的属性,也可以当作参数传入其他函数,或者作为函数的结果返回。唯一的特殊之处是函数是可执行的。

本文讨论JavaScript中函数的基本用法。

函数定义

JavaScript定义函数有以下方式:

  • function命令
function fn(x,y) {
// do something...
}
  • 函数表达式
let fn = function() {
// do something...
}

  • 箭头函数
let fn = x => x*x // 只有一个参数时,括号可以省略
let fn = (x,y) => x + y // 只有return语句时,return关键字可省略
let fn = (x,y) => {return x + y} // 不省略return的写法
let fn = (x,y) => ({name: x, age: y}) // 省略return,直接返回对象会出错,需要加一对圆括号
  • 使用Function构造方法构造
let fn = new Function('x', 'y', 'return x + y')

这种方法用得很少。
所有函数都是由Function构造出来的,包括ObjectArrayFunction

函数参数

形参和实参

  • 形参是我们定义函数时的参数

  • 实参是调用函数时传过去的参数

function add(x, y) { // x, y是形参
return x + y
}

add(1, 2) // 1, 2是实参

JavaScript中,函数调用时,如果形参和实参数量不一致,不会报错。这点和Java不同。

  1. 如果实际传递的参数数量比形参数量少,那么没有对应实参的形参,值是undefined

  2. 如果实际传递的参数数量比形参数量多,多出来的参数不会赋值给任何形参,但是在函数体内部可以通过arguments对象获取。

function add(x, y) { // x, y是形参
return x + y
}

add(1); // y === undefined
add(1, 2, 3); // x === 1, y === 2, arguments[2] = 3

剩余参数

剩余参数已被加入ES6 标准。

为函数的最后一个命名参数前加上省略号(…)前缀,这个参数就变成了一个叫作剩余参数的数组,数组内包含着传入的剩余的参数。

function multiMax(first, ...rest) {
...
}

multiMax(1, 2, 3, 4, 5); // rest = [2, 3, 4, 5]
multiMax(1, 3, 5, 7); // rest = [3, 5, 7]

只有函数的最后一个参数才能是剩余参数。

默认参数

默认参数已被加入ES6 标准。

function f(name, age=18){
console.log(name, age);
}

f('Mary') // Mary, 18
f('John', 19) // John, 19

arguments

由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。arguments对象包含了函数运行时的所有参数,arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。

function sum() {
let result = 0;
for(let i = 0; i < arguments.length; i ++) {
result += arguments[i];
}
return result;
}

sum(1, 2, 3); // 6
sum(1, 2, 3, 4, 5); // 15

注意:箭头函数里没有arguments,箭头函数里的argumentsundefined

除了可以通过arguments获取到参数的值,也可以通过它在函数内部修改参数的值。不过,在严格模式下,不能通过arguments修改参数值。

参考

函数 - JavaScript教程 - 网道

Author: kpt

Permalink: http://kpt.ink/2021/08/03/JavaScript%E5%87%BD%E6%95%B0%E5%9F%BA%E7%A1%80/

文章默认使用 CC BY-NC-SA 4.0 协议进行许可,使用时请注意遵守协议。