函数竟然有 length ?

395 阅读2分钟

一、考试遇到函数的 length

近来考了 12 场试。其中,有一道 js 题让我耿耿于怀!约莫如下:有一个函数,含三个形参,第二个形参有默认值,求该函数的 length

// 1.已知:
function fn(a, b = 1, c) {
    return a + b + c
}
// 2.求解:
console.log(fn.length)

我想,你但凡动手敲一敲,答案就出来了。但是为什么是 1 呢?是指函数形参的默认值有几个吗?如果是第一个形参有默认值呢?如果没有默认值呢?如果没有形参呢?这有什么应用场景吗?我百思不得其解。

于是,在一个夜黑风高、无人问津的晚上,我开始研究函数的 length ......

二、函数的 length 属性

1.无参,函数 length 为 0

function fn() {
    log('我是 fn 呀')
}
console.log(fn.length)//0

2.有参无默认值,函数 length 为 形参个数

function fn1(a, b, c) {
    return a + b + c
}
console.log(fn1.length)//3

3.有参有默认值,函数 length 为第一个具有默认值之前的参数个数

function fn2(a = 10, b, c) {
    return a + b + c
}
console.log(fn2.length)//0

function fn3(a, b = 7, c) {
    return a + b + c
}
console.log(fn3.length)//1

function fn4(a, b, c = 3) {
    return a + b + c
}
console.log(fn4.length)//2

function fn5(a = 5, b = 9, c = 8) {
    return a + b + c
}
console.log(fn5.length)//0

4. 如果函数内部是通过 arguments 调用参数,而没有实际定义参数,则 length 为0

function fn6() {
    console.log(arguments.length)
}
console.log(fn6.length)//0
fn6(1, 2)//2

5. Function 构造器的属性 length 为1

console.log(Function.length)// 1

三、函数的 length 代表什么

综上所述:

  1. 函数的 length 是 js 对象的一个属性,代表形参的个数
  2. 形参的数量不包括剩余参数的个数,仅包括第一个具有默认值之前的参数个数
  3. 与之对比的是,arguments.length 是函数被调用时实际传参的个数

可是啊,它到底有何应用场景嘞?