I've noticed this error pop up a few times, and unfortunately, debugging it can sometimes be difficult.
Uncaught RangeError: Maximum call stack size exceeded
While not always, typically I see this error within a recursive function.
What did I do to get this error?
Here's an example of how the error could occur:
function fibonacci(num){
if (num === 1)
{
return [0, 1]
}
else
{
var s = fibonacci(num - 1)
s.push(s[s.length - 1] + s[s.length - 2])
return s
}
};
fibonacci(20000)[20000]
Why didn't it work?
- The call stack is the list of all the different operations that have performed in order.
- Recursive functions, by definition, call themselves in at least one logic branch (in this case, when num != 1).
- Since this is a recursive function, calling this method 20,000 times caused the call stack to grow too large.
The solution
In the case of a recursive function causing this error, it's often best to re-write the logic so that it isn't recursive, or find some method of batching the recursion.
In this case, I re-wrote it so that it isn't recursive:
function fibonacci(num) {
var a = 1, b = 0, temp
while (num >= 0){
temp = a
a = a + b
b = temp
num--
}
return b
}
fibonacci(200000)
In short, recursive functions work great unless there are a few thousand iterations!