Подтвердить что ты не робот

Во время отладки javascript существует ли способ предупредить текущий стек вызовов?

Для простой отладки javascript я буду использовать предупреждения для отображения значений переменных и т.п. Есть ли способ заставить текущий стек вызовов в javascript отображать его в сообщении?

Спасибо.

4b9b3361

Ответ 1

Быстрая и грязная в браузерах на базе Gecko:

new Error().stack

Вы также можете вручную тралить часть стека, используя Function.prototype.caller:

var thisFunction = arguments.callee;
var caller = thisFunction.caller;
var callerCaller = caller.caller;
// ...and eventually, assuming no recursion:
var bottomCaller = ...;
assert(bottomCaller.caller === null);

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

Еще одна оговорка к caller заключается в следующем: если в любом из ваших кодов используется строгий режим ECMAScript 5, свойство caller функций строгого режима (или функций, которые сами вызывались из строгих функций режима) так называемая "ядовитая таблетка", которая бросает TypeError при доступе. Свойство caller "связанных" функций (созданных методом ES5 Function.prototype.bind) также является ядовитой таблеткой. Эти ограничения нарушают общий алгоритм стековой ходьбы, хотя можно представить, как использовать его для использования (это могут быть функции входа и выхода для аннотирования).

Заметьте, что стековая ходьба, как это, не является отличной идеей в производственном коде (в качестве быстрого взлома для отладки, отлично, tho); в тот момент, когда вы поднимаете стек, поскольку в последнем примере несколько дороже в Mozilla JS engine, и он, вероятно, выкинет вас из машинного кода и вернется в интерпретируемый код. Кроме того, стековая прогулка - это O (n 2), что может иметь значение, если у вас есть сложные, глубокие стеки.

Ответ 2

В Firefox + Firebug и WebKit вы можете использовать console.trace()

Он не отображает alert(), а печатает stacktrace на консоли.

Ответ 3

Используйте этот отладчик, например Firebug, если вы находитесь в Firefox. У Chrome и Opera есть встроенный отладчик. И Инструменты разработчиков для Internet Explorer.

Ответ 4

Лучший способ отладки Javascript - использовать Firebug, который включает полный отладчик Javascript.

Если вы отлаживаете IE, вы можете использовать Visual Web Developer Express (или любую другую редакцию Visual Studio).
Если вы отлаживаете IE8, вы можете использовать его встроенные инструменты разработчика, в том числе отладчик.

Можно получить стек вызовов в Javascript; см. здесь.

Ответ 5

Вы смотрели на firebug - и точку останова. Если это просто для отладки, тогда этого может быть достаточно.

Кроме того, вы можете посмотреть Здесь

Ответ 6

Это даст вам весь стек вызовов работаю хорошо для меня.

var y = 'arguments.callee.caller';
    while (eval(y) != undefined) {
        stak += eval(y + '.toString()');
        y = y + '.caller';
    }
    alert(stak);

Ответ 7

Для отладки nodejs, в Visual Studio Code, начиная с версии 1.1.2.2, View- > Debug (Ctrl + Shift + D)