为什么 apply with too many arguments 会抛出 "Maximum call stack size exceeded"?
Why does apply with too many arguments throw "Maximum call stack size exceeded"?
在Chrome和Node中,以下代码会抛出错误:
function noop() {}
var a = new Array(1e6)
// Array[1000000]
noop.apply(null, a)
// Uncaught RangeError: Maximum call stack size exceeded
我明白为什么将 100 万个参数传递给一个函数可能是个坏主意,但谁能解释为什么错误是 Maximum call stack size exceeded
而不是更相关的错误?
(如果这看起来很无聊,原来的情况是 Math.max.apply(Math, lotsOfNumbers)
,这是从数组中获取最大数的一种不合理的方法。)
函数参数放在堆栈上。您正试图将一百万个参数放入堆栈,这超过了最大堆栈大小。所以报错信息和报错原因很相关。
在Chrome和Node中,以下代码会抛出错误:
function noop() {}
var a = new Array(1e6)
// Array[1000000]
noop.apply(null, a)
// Uncaught RangeError: Maximum call stack size exceeded
我明白为什么将 100 万个参数传递给一个函数可能是个坏主意,但谁能解释为什么错误是 Maximum call stack size exceeded
而不是更相关的错误?
(如果这看起来很无聊,原来的情况是 Math.max.apply(Math, lotsOfNumbers)
,这是从数组中获取最大数的一种不合理的方法。)
函数参数放在堆栈上。您正试图将一百万个参数放入堆栈,这超过了最大堆栈大小。所以报错信息和报错原因很相关。