Spec-Zone.ru › JavaScript

Error.prototype.stack

Нестандартно: Эта функция является нестандартной и не находится на пути стандартизации. Не используйте ее на производственных сайтах, ориентированных на Интернет: она будет работать не для каждого пользователя. Также могут существовать значительные несовместимости между реализациями, а поведение может измениться в будущем.

Нестандартно: Эта функция является нестандартной и не находится на пути стандартизации. Не используйте ее на производственных сайтах, ориентированных на Интернет: она будет работать не для каждого пользователя. Также могут существовать значительные несовместимости между реализациями, а поведение может измениться в будущем.

Примечание: Свойство stack де-факто реализовано всеми основными движками JavaScript, и комитет по стандартам JavaScript стремится его стандартизировать. Вы не можете полагаться на точное содержимое строки стека из-за несоответствий в реализациях, но в целом можно предположить, что оно существует, и использовать его для целей отладки.

Нестандартное свойство stack экземпляра Error предоставляет трассировку того, какие функции были вызваны, в каком порядке, из какой строки и файла, и с какими аргументами. Строка стека формируется от самых последних вызовов к более ранним, возвращаясь к исходному вызову глобальной области видимости.

Значение

Строка.

Поскольку свойство stack является нестандартным, реализации различаются в отношении того, где оно установлено.

  • В Firefox это свойство-аксессор на Error.prototype.
  • В Chrome и Safari это свойство данных на каждом экземпляре Error со следующим дескриптором:
Атрибуты свойства Error.prototype.stack
Доступность для записи да
Перечисляемость нет
Конфигурируемость да

Описание

Каждый движок JavaScript использует свой собственный формат для трассировок стека, но они достаточно согласованы в своей высокоуровневой структуре. Каждая реализация использует отдельную строку в стеке для представления каждого вызова функции. Вызов, который непосредственно вызвал ошибку, помещается вверху, а вызов, который начал всю цепочку вызовов, помещается внизу. Ниже приведены некоторые примеры трассировок стека:

function foo() {
  bar();
}

function bar() {
  baz();
}

function baz() {
  console.log(new Error().stack);
}

foo();
#### JavaScriptCore
baz@filename.js:10:24
bar@filename.js:6:6
foo@filename.js:2:6
global code@filename.js:13:4

#### SpiderMonkey
baz@filename.js:10:15
bar@filename.js:6:3
foo@filename.js:2:3
@filename.js:13:1

#### V8
Error
    at baz (filename.js:10:15)
    at bar (filename.js:6:3)
    at foo (filename.js:2:3)
    at filename.js:13:1

V8 предоставляет нестандартный API трассировки стека для настройки трассировки стека, включая Error.captureStackTrace(), Error.stackTraceLimit и Error.prepareStackTrace(). Другие движки поддерживают этот API в различной степени.

Разные движки устанавливают это значение в разное время. Большинство современных движков устанавливают его при создании объекта Error. Это означает, что вы можете получить полную информацию о стеке вызовов внутри функции, используя следующее:

function foo() {
  console.log(new Error().stack);
}

Без необходимости генерировать ошибку, а затем перехватывать ее.

Кадры стека могут быть не только явными вызовами функций. Например, обработчики событий, задачи по тайм-ауту и обработчики промисов — все они начинают свою собственную цепочку вызовов. Исходный код внутри вызовов конструкторов eval() и Function также отображается в стеке:

console.log(new Function("return new Error('Function failed')")().stack);
console.log("====");
console.log(eval("new Error('eval failed')").stack);
#### JavaScriptCore
anonymous@
global code@filename.js:1:65
====
eval code@
eval@[native code]
global code@filename.js:3:17

#### SpiderMonkey
anonymous@filename.js line 1 > Function:1:8
@filename.js:1:65

====
@filename.js line 3 > eval:1:1
@filename.js:3:13

#### V8
Error: Function failed
    at eval (eval at <anonymous> (filename.js:1:13), <anonymous>:1:8)
    at filename.js:1:65
====
Error: eval failed
    at eval (eval at <anonymous> (filename.js:3:13), <anonymous>:1:1)
    at filename.js:3:13

В Firefox вы можете использовать директиву //# sourceURL для именования источника eval. См. документацию Firefox Debug eval sources.

Примеры

Использование свойства stack

Следующий скрипт демонстрирует, как использовать свойство stack для вывода трассировки стека в окно браузера. Вы можете использовать это, чтобы проверить, как выглядит структура стека вашего браузера.

<div id="output"></div>
#output {
  white-space: pre;
  font-family: monospace;
}
function trace() {
  throw new Error("trace() failed");
}
function b() {
  trace();
}
function a() {
  b(3, 4, "\n\n", undefined, {});
}
try {
  a("first call, first arg");
} catch (e) {
  document.getElementById("output").textContent = e.stack;
}

Спецификации

Не является частью какого-либо стандарта.

Совместимость с браузерами

Настольные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
stack
3
12
1
10.5
6
18
4
11
6
1.0
4.4
6
1.0.0
1.0
0.10.0

См. также

  • TraceKit на GitHub
  • stacktrace.js на GitHub
  • API трассировки стека (Stack trace API) в документации V8

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API