Non-standard
This feature is non-standard and is not on a standards track. Do not use it on production sites facing the Web: it will not work for every user. There may also be large incompatibilities between implementations and the behavior may change in the future.

Нестандартна властивість stack об'єктів Error надає звіт про те, які функції були викликані, в якому порядку, з якого рядка файлу та з якими аргументами. Текстовий рядок стеку ведеться з останніх викликів до більш ранніх, і аж до початкового виклику у глобальній області видимості.

Опис

Кожний крок буде відокремлений новим рядком, де перша частина є іменем функції (якщо це не виклик з глобальної області видимості), далі через символ @ розташування файлу (окрім випадку, коли функція є конструктором помилки під час викидання помилки), двокрапка та, якщо доступне розташування файлу, номер рядка. (Зауважте, що об'єкт Error також має властивості fileName, lineNumber та columnNumber для отримання цієї інформації про помилку, що викидається (але тільки про помилку, а не стек її викликів).)

Зауважте, що це формат, який використовується у Firefox. Не існує стандартного формату. Однак, Safari 6+ та Opera 12- використовують дуже схожий формат. Переглядачі на рушії JavaScript V8 (такі, як Chrome, Opera 15+, Android Browser) та IE10+, з іншого боку, використовують інший формат (дивіться документи MSDN error.stack).

Значення аргументів у стеку: До версії Firefox 14 (bug 744842), після імені функції були б записані значення аргументів, перетворені у рядок, у круглих дужках, одразу перед знаком @. І якщо об'єкти (або масиви) були б виведені у вигляді "[object Object]", і таким чином не могли бути перетворені назад у справжні об'єкти, то скалярні величини можна відновити (хоча, можливо — це досі доступно у Firefox 14 — легше використовувати arguments.callee.caller.arguments, а ім'я функції можна отримати через arguments.callee.caller.name). "undefined" записується як "(void 0)". Зауважте, що, якщо рядкові аргументи були передані з такими символами як "@", "(", ")" (або вони присутні в іменах файлів), на них не можна покладатись для розбиття рядка на окремі частини. Таким чином, у Firefox 14 та пізніших версіях це вже не є такою проблемою.

Різні веб-переглядачі встановлюють це значення в різні моменти. Наприклад, Firefox встановлює його при створенні об'єкта Error, в той час як PhantomJS встановлює його лише при викиданні об'єкта Error, а реалізація у MSDN docs, схоже, співпадає з PhantomJS.

Приклад

Наступна HTML-розмітка демонструє використання властивості stack .

<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Приклад трасування стеку</title>
<body>
<script>
function trace() {
  try {
    throw new Error('myError');
  }
  catch(e) {
    alert(e.stack);
  }
}
function b() {
  trace();
}
function a() {
  b(3, 4, '\n\n', undefined, {});
}
a('перший виклик, першийАргумент');
</script>

За умови, що наведена розмітка збережена як C:\example.html у файловій системі Windows, вона створить діалогове вікно оповіщення з наступним текстом:

Firefox 30 та новіші містять номер стовпця (bug 762556):

trace@file:///C:/example.html:9:17
b@file:///C:/example.html:16:13
a@file:///C:/example.html:19:13
@file:///C:/example.html:21:9

З Firefox 14 по Firefox 29:

trace@file:///C:/example.html:9
b@file:///C:/example.html:16
a@file:///C:/example.html:19
@file:///C:/example.html:21

Firefox 13 та старші натомість виведуть наступний текст:

Error("myError")@:0
trace()@file:///C:/example.html:9
b(3,4,"\n\n",(void 0),[object Object])@file:///C:/example.html:16
a("перший виклик, першийАргумент")@file:///C:/example.html:19
@file:///C:/example.html:21

Стек коду у eval() та Function()

Починаючи з Firefox 30 (Firefox 30 / Thunderbird 30 / SeaMonkey 2.27 / Firefox OS 1.4), стек помилки коду у викликах Function() та eval() тепер створює звіти з більш детальною інформацією щодо номеру рядків та стовпчиків у цих викликах. Виклики Function позначаються записом "> Function", а виклики eval записом "> eval". Дивіться bug 332176.

try {
  new Function('throw new Error()')();
} catch (e) {
  console.log(e.stack);
}

// anonymous@file:///C:/example.html line 7 > Function:1:1
// @file:///C:/example.html:7:6


try {
  eval("eval('FAIL')");
} catch (x) {
  console.log(x.stack);
}

// @file:///C:/example.html line 7 > eval line 1 > eval:1:1
// @file:///C:/example.html line 7 > eval:1:1
// @file:///C:/example.html:7:6

Ви також можете скористатися директивою //# sourceURL, щоб присвоїти ім'я коду, що передається. Дивіться також Відладка коду у eval() та Function() у статтях на сторінці Debugger, а також цей пост.

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

Не є частиною жодних специфікацій. Нестандартна властивість.

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
stack
Non-standard
Chrome Full support YesEdge No support NoFirefox Full support 1IE Full support 10Opera Full support YesSafari Full support 6WebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support 6Samsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support
No support  
No support
Non-standard. Expect poor cross-browser support.
Non-standard. Expect poor cross-browser support.

Див. також

Мітки документа й учасники

Зробили внесок у цю сторінку: DariaManko
Востаннє оновлена: DariaManko,