O tamanho máximo da pilha de chamadas excedeu o erro

Estou usando um arquivo de biblioteca JavaScript Direct Web Remoting (DWR) e estou recebendo um erro apenas no Safari (desktop e iPad)

Diz

Tamanho máximo da pilha de chamadas excedido.

O que significa exactamente este erro e pára completamente o processamento?

Também qualquer correção para o navegador Safari (Na verdade, no iPad Safari, ele diz

JS:execução excedeu o tempo limite

que presumo ser a mesma questão do call stack)

Solução

Isso significa que em algum lugar em seu código, você está chamando uma função que por sua vez chama outra função e assim por diante, até atingir o limite da pilha de chamadas.

Isto é quase sempre devido a uma função recursiva com um caso base que está't sendo cumprido.

Vendo a pilha

Considere este código...

(function a() {
    a();
})();

Aqui está a pilha depois de uma mão cheia de chamadas...

Como você pode ver, a pilha de chamadas cresce até atingir um limite: o tamanho da pilha codificada no navegador ou o esgotamento da memória.

Para o corrigir, assegure-se de que a sua função recursiva tem um caso base que é capaz de ser cumprido...

(function a(x) {
    // The following condition 
    // is the base case.
    if ( ! x) {
        return;
    }
    a(--x);
})(10);
Comentários (16)

Você pode obter isso às vezes se você acidentalmente importar/integrar o mesmo arquivo JavaScript duas vezes, vale a pena verificar na sua guia de recursos do inspetor.

Comentários (6)

Existe um loop recursivo algures no seu código (ou seja, uma função que eventualmente se chama a si própria uma e outra vez até a pilha estar cheia).

Os outros navegadores ou têm pilhas maiores (assim você ganha um timeout) ou eles engolem o erro por alguma razão (talvez uma tentativa mal colocada).

Use o depurador para verificar a pilha de chamadas quando o erro acontece.

Comentários (3)