我的求和函数触发"maximum call stack size exceeded"错误,如何修复?
修复"maximum call stack size exceeded"错误的方法
嘿,我来帮你搞定这个问题!你遇到的这个错误是调用栈溢出,说白了就是函数自己无限调用自己,停不下来,把引擎的调用栈给撑爆啦。咱们先拆解下你代码里的问题:
先看看你写的代码片段:
var add = function(num1, num2, num3, num4, num5) { for(i = 0; i < add.length; i++) { if(i === 0) { var first = add(i); } else if(i ...
问题出在哪?
- 第一个致命问题:你在循环里写了
add(i),这相当于让add函数自己调用自己,但你完全没有设置停止递归的条件,它会一直调用下去,直到触发栈溢出错误。 - 第二个逻辑错误:
add.length指的是这个函数定义时声明的参数个数(也就是5),而不是你传入的参数值的集合。你想用循环遍历求和,但找错了对象~
修复方案
如果你只是想实现对传入的这5个参数求和,咱们可以改成这样:
var add = function(num1, num2, num3, num4, num5) { // 先把所有参数放进数组,方便遍历累加 const numbers = [num1, num2, num3, num4, num5]; let total = 0; // 遍历数组,把有效数字加起来 for(let i = 0; i < numbers.length; i++) { // 加个判断,避免非数字参数导致结果变成NaN if(typeof numbers[i] === 'number' && !isNaN(numbers[i])) { total += numbers[i]; } } return total; }; // 测试一下 console.log(add(1, 2, 3, 4, 5)); // 输出15
要是你想更灵活,不管传多少个参数都能求和,可以用ES6的rest参数,写法更简洁:
// 用rest参数接收所有传入的参数 const add = (...numbers) => { // 用reduce方法快速累加 return numbers.reduce((total, num) => { // 同样判断是否是有效数字 return typeof num === 'number' && !isNaN(num) ? total + num : total; }, 0); }; // 随便传多少参数都能用 console.log(add(10, 20)); // 30 console.log(add(1, 2, 3, 4, 5, 6)); // 21
关键提醒
- 绝对不要在函数内部无终止条件地调用自身,这会直接导致无限递归,触发栈溢出。
- 函数的
length属性是它定义时的参数个数,不是传入的值的数量,别搞混啦。 - 如果要处理不确定数量的参数,用rest参数或者ES5的
arguments对象会更方便。
内容的提问来源于stack exchange,提问作者Niki45nk
相关产品推荐
相关产品推荐

