--- title: Error.prototype.stack slug: Web/JavaScript/Reference/Global_Objects/Error/Stack tags: - JavaScript - Prototyp - Referencja - Własność - niestandardowe translation_of: Web/JavaScript/Reference/Global_Objects/Error/Stack original_slug: Web/JavaScript/Referencje/Obiekty/Error/Stack ---
Niestandardowa własność stack obiektów {{jsxref("Error")}} podaje ścieżkę wywołań funkcji – które z nich były wywołane, w jakiej kolejności, z której linii i pliku, z jakimi argumentami. Stos wywołań zaczyna się od ostatnich wywołań, przez wcześniejsze, prowadząc do pierwotnego wywołania z zakresu globalnego.
Każdy krok będzie znajdował się w oddzielnej linii, zawierając w pierwszej części nazwę funkcji (jeśli nie jest to wywołanie z zakresu globalnego), następnie znak at (@), lokalizację pliku (z wyjątkiem sytuacji, w których funkcja jest konstruktorem zgłaszanego błędu), dwukropek oraz numer linii (jeśli zdefiniowana jest lokalizacja pliku). (Zauważ, że obiekt {{jsxref("Error")}} także posiada własności fileName, lineNumber i columnNumber, które można odczytać z danego błędu, jednak jedynie błędu, a nie jego stosu wywołań).
Należy podkreślić, że opisany wyżej format jest formatem przeglądarki Firefox – nie ma standardu formatowania, jednakże Safari 6+ i Opera 12- używają bardzo podobnego formatu. Przeglądarki używające silnika JavaScript V8 (takie jak Chrome, Opera 15+, Android Browser) oraz IE10+, używają natomiast innego formatu (zobacz archiwalną dokumentację MSDN dla error.stack).
Wartości argumentów w stosie: w wersjach wcześniejszych niż Firefox 14, po nazwie funkcji następowały wartości argumentów przekonwertowane do łańcucha znaków (string) w nawiasach, przed znakiem at (@). Podczas gdy obiekt (lub tablica itp.) pojawia się w przekonwertowanej formie "[object Object]" i nie może być przekonwertowany z powrotem do właściwych obiektów, wartości skalarne mogą być odzyskane (choć być może — w Firefoksie 14 nadal jest to możliwe — łatwiej będzie użyć arguments.callee.caller.arguments, tak jak nazwa funkcji może być uzyskana przez arguments.callee.caller.name). "undefined" jest wylistowany jako "(void 0)". Zauważ, że jeśli argumenty typu string były przekazane z wartościami takimi jak "@", "(", ")" (lub znaki te występują w nazwach plików), nie możesz polegać po prostu na podzieleniu linii na części składowe – dlatego w Firefoksie 14 i nowszych jest to mniejszy problem.
Różne przeglądarki ustawiają tę wartość w różnych momentach. Przykładowo, Firefox ustawia ją podczas tworzenia obiektu {{jsxref("Error")}}, natomiast PhantomJS ustawia ją jedynie podczas wyrzucania {{jsxref("Error")}} – i archiwalna dokumentacja MSDN również wydaje się zgadzać z implementacją PhantomJS.
stackPoniższy dokument HTML prezentuje użycie własności stack.
<!DOCTYPE HTML>
<meta charset="UTF-8">
<title>Stack Trace Example</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('first call, firstarg');
</script>
Zakładając, że powyższy dokument zapisany jest pod adresem C:\example.html w systemie plików Windows, kod utworzy okno typu alert z następującą treścią:
W przeglądarce Firefox 30 i późniejszych wersjach, wraz z numerem kolumny:
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
Od Firefoxa 14 do Firefoxa 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 i wcześniejsze zwróci zamiast tego następujący tekst:
Error("myError")@:0
trace()@file:///C:/example.html:9
b(3,4,"\n\n",(void 0),[object Object])@file:///C:/example.html:16
a("first call, firstarg")@file:///C:/example.html:19
@file:///C:/example.html:21
Od Firefoxa 30, stos błędu w wywołaniach Function() i eval() tworzy stos z bardziej szczegółową informacją o linii i kolumnie wewnątrz tych wywołań. Wywołania funkcji są wskazywane przez "> Function", a eval przez "> eval".
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
Możesz także użyć dyrektywy //# sourceURL do nazwania źródła eval. Zobacz też źródła Debug eval w dokumentacji Debuggera oraz w tym artykule.
Nie jest częścią żadnego standardu.
{{Compat("javascript.builtins.Error.stack")}}