MST

星途 面试题库

面试题:JavaScript默认参数与剩余参数的作用域及异常情况

下面的JavaScript代码有一个函数定义,其中涉及默认参数和剩余参数。请分析该代码在运行时会输出什么,并解释原因。如果有潜在的错误,指出错误并说明如何修正。 ```javascript function testFunction(a = b + 1, ...rest) { console.log(a); console.log(rest); } let b = 5; testFunction(10, 20, 30); ```
13.3万 热度难度
编程语言JavaScript

知识考点

AI 面试

面试题答案

一键面试
  1. 输出及原因分析
    • 代码运行时会报错。原因是在函数testFunction定义中,默认参数a = b + 1,这里b在函数定义时还未声明,JavaScript 中函数的默认参数是在函数定义阶段进行计算的,而不是在函数调用阶段。在定义函数testFunction时,b还不存在,所以会报ReferenceError: b is not defined错误。
  2. 修正方法
    • 一种方法是在函数定义前声明b
let b = 5;
function testFunction(a = b + 1, ...rest) {
  console.log(a);
  console.log(rest);
}
testFunction(10, 20, 30);
  • 这样修改后,函数定义时b已经存在,默认参数a = b + 1可以正确计算。当调用testFunction(10, 20, 30)时,由于传入了第一个参数10,所以a的值为10rest的值为数组[20, 30],输出结果为:
10
[20, 30]
  • 另一种方法是将默认参数的计算逻辑放到函数内部:
function testFunction(...rest) {
  let a;
  if (rest.length === 0) {
    let b = 5;
    a = b + 1;
  } else {
    a = rest[0];
    rest.shift();
  }
  console.log(a);
  console.log(rest);
}
testFunction(10, 20, 30);
  • 这种情况下,b的声明和计算在函数内部,避免了函数定义时b未声明的问题。输出同样为:
10
[20, 30]