OK, wymyśliłem problem. Naprawdę nie było rekursji w moim kodzie. Możliwe jest wywoływanie funkcji JavaScript z setkami argumentów, jeśli są to funkcje "varargs", takie jak na przykład <array>.splice(...)
, który był moim sprawcą.
Na stronie internetowej: GWT implementuje funkcję Java System.arraycopy(...)
przy użyciu funkcji łączenia JavaScript w bardziej lub mniej inteligentny sposób.
splice akceptuje dowolną liczbę elementów wejściowych do wstawienia do tablicy docelowej. Jest możliwe, aby przekazać te elementy wejściowe z innej tablicy stosując następujące konstrukt:
var arguments = [index, howmany].concat(elements);
Arrays.prototype.splice.apply(targetarray, arguments);
jest to równoznaczne z wywołaniem:
targetarray.splice(index, howmany, elements[0], elements[1], elements[2], ...);
Jeśli elementy wystąpią duże (patrz poniżej, co „wielki "oznacza dla różnych przeglądarek), możesz może dostać" Przekroczony maksymalny rozmiar stosu połączeń "bez rekursji, ponieważ jego zawartość zostanie załadowana na stos dla wywołania funkcji.
Oto krótki skrypt, który demonstruje ten problem:
var elements = new Array();
for (i=0; i<126000; i++) elements[i] = 1;
try {
var arguments = [0, 0].concat(elements);
Array.prototype.splice.apply(elements, arguments);
alert("OK");
} catch (err) {
alert(err.message);
}
Stosując ten scenariusz, "wielki" oznacza:
- Chrome 19: Elementy zawiera ~ 125000 numery
- Safari 5.1 (w systemie Windows): elementy zawierają ~ 65 000 numerów
- Firefox 12: elementy zawierają ~ 500 000 liczb
- Opera 11.61: elementy zawierają ~ 1,000,000 liczb
Zwycięzcą jest: Internet Explorer 8 dla odmiany! Może wykorzystać całą pamięć systemową, zanim ta funkcja nie powiedzie się.
Na marginesie: Firefox i Opera faktycznie rzucać inny (bardziej użyteczne) Komunikat o błędzie: funkcji Function.prototype.apply: argArray jest zbyt duża
+1 dla interesującego posta – pixelbobby
Nie rozumiał, co widzisz . To, co się stało, to funkcja rekursywna, czyli funkcja, która sama wywołuje (lub wywołuje inną funkcję, która wywołuje pierwszą) prawdopodobnie przez przypadek. – Ben
(powiązane) http://stackoverflow.com/questions/6602864/stack-and-heap-in-v8-javascript –