определить глубину стека в JavaScript с помощью JavaScript - PullRequest
7 голосов
/ 06 декабря 2011

Есть ли способ определить глубину стека всех функций, выполняемых в javascript, с использованием самого javascript?

Я думаю, что это может включать изменение прототипа Function, но я действительно неесть идеи.

Кроме того, было бы неплохо иметь возможность разбивать каждый раз, когда глубина стека была достаточно высокой.

Причина этого в том, что у меня ошибка переполнения стека в IE, который, по-видимому, не отлаживается .Я ленивый, и мне не пришлось бы искать код, который я поддерживаю, чтобы найти причину.

Спасибо за помощь моей лени.

Ответы [ 2 ]

5 голосов
/ 06 декабря 2011

ECMAscript довольно долго поддерживается свойством Function.prototype.caller. Даже если он устарел в строгом ES5, IE все равно должен его поддерживать. Таким образом, вы можете в основном пройтись по задействованным функциям.

function one() {
   two();
}

function two() {
   three();
}

function three() {
    var caller = three.caller;

    console.log('caller was: ', caller.name);

    while( caller = caller.caller ) {
           console.log('caller was: ', caller.name);
    }
}

(function outer() {
    one();
}());

Это будет выводить:

caller was: two
caller was: one
caller was: _outer

Итак, если вы знаете, в какой функции происходит ошибка, вы получите полный ответ на вопрос, как изначально вызывался этот метод. Если вы только после глубины, вы можете просто посчитать, сколько было сделано целых чисел по свойству caller.caller. По крайней мере, IE8 должен поддерживать оператор «отладчик», который можно просто вызвать в этом скрипте, чтобы вывести отладчик на сцену.

4 голосов
/ 06 декабря 2011
function stackDepth() {
  var c=stackDepth.caller, depth=0;
  while (c) { c = c.caller; depth++; }
  return depth;
}

Похоже, что Chrome считает, что глубина стека из консоли уже равна 3, поэтому, возможно, для каждой среды JavaScript вам нужно будет определить начальную глубину базовой линии и вычесть из нее.

stackDepth(); // => 3
(function(){return stackDepth();})(); // => 4
...