2017-02-16 3 views
6

В Chrome и узел, следующий код выдает ошибку:Почему применяется слишком много аргументов, чтобы вывести «Максимальный размер стека вызовов»?

function noop() {} 
var a = new Array(1e6) 
// Array[1000000] 
noop.apply(null, a) 
// Uncaught RangeError: Maximum call stack size exceeded 

Я понимаю, почему это может быть плохой идеей, чтобы передать 1 миллион аргументов в функцию, но может кто-нибудь объяснить, почему ошибка Maximum call stack size exceeded вместо что-то более актуальное?

(В случае, если это кажется несерьезным, оригинальный случай был Math.max.apply(Math, lotsOfNumbers), который является не-неразумным способом получить максимальное число из массива.)

+0

... потому что аргументы функции хранятся в стеке? – Bergi

+0

Ну, да, это часть информации, которую я отсутствовал :) – nrabinowitz

ответ

8

аргументов функции помещаются в стек. Вы пытаетесь поставить миллион аргументов в стек, и это больше, чем максимальный размер стека. Поэтому сообщение об ошибке очень важно для причины ошибки.

+0

Для тех, кто хочет более конкретных ограничений размера стека браузера, я нашел это: http://stackoverflow.com/questions/7826992/browser-javascript-stack-size- предел – chrispy

Смежные вопросы