2017-02-16 44 views
6

W Chrome i Węzła poniższy kod generuje błąd:Dlaczego zastosowanie ze zbyt dużą liczbą argumentów powoduje "Przekroczono maksymalny rozmiar stosu wywołań"?

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

rozumiem, dlaczego to może być zły pomysł, aby przekazać 1 milion argumentów do funkcji, ale może ktoś wyjaśnić, dlaczego błąd jest Maximum call stack size exceeded zamiast coś bardziej istotnego?

(W przypadku, gdy wydaje się niepoważne, oryginalny sprawa była Math.max.apply(Math, lotsOfNumbers), która jest nie-rozsądnym sposobem na uzyskanie numeru z tablicy max.)

+0

... ponieważ argumenty funkcji są przechowywane na stosie? – Bergi

+0

Cóż, tak, to jest informacja, której mi brakowało :) – nrabinowitz

Odpowiedz

8

Argumenty funkcji są umieszczane na stosie. Próbujesz umieścić milion argumentów na stosie, a to więcej niż maksymalny rozmiar stosu. Tak więc komunikat o błędzie jest bardzo istotny dla przyczyny błędu.

+0

Dla każdego, kto chciałby mieć więcej ograniczeń wielkości stosu przeglądarki, znalazłem to: http://stackoverflow.com/questions/7826992/browser-javascript-stack-size- limit – chrispy