> One observable consequence of tail calls is (besides a reduced risk of stack overflow) that tail callers do not appear in stack traces. Neither do they appear in the stack property of a caught exception, nor in the DevTools stack trace.
This is because stack traces are continuations; i.e. they show the future of our computation; those things which have not yet been done.
Reaching a function's tail position means, by definition, that its computations are finished. Hence why such functions don't appear in stack traces; the same way that, say, a call like 'foo(bar(42))' won't include 'bar' in a stack trace if 'foo' crashes.
> By the time an exception is thrown, or execution pauses, the tail caller frames are gone and there is no way for V8 to recover them.
This can be done by a time-travelling debugger; since that keeps a trace of past computations. It also adds overhead, though.