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