MDN говорит: :
Другой устаревшей функцией была arguments.callee.caller
, точнее Function.caller
. Почему это? Что ж, в любой момент времени вы можете найти самого глубокого вызывающего из любой функции в стеке, и, как я сказал выше, просмотр стека вызовов имеет один главный эффект: он делает невозможным большое количество оптимизаций или гораздо более сложное . Например, если вы не можете гарантировать, что функция f
не вызовет неизвестную функцию, невозможно встроить f
.
Но в то же время у нас есть стек вызовов ( но только как текст, а не как функции) при возникновении ошибки.
Итак, мой вопрос: почему arguments.callee.caller
предотвращает встраивание, а выдача ошибки - нет, если у них обоих должен быть правильный стек вызовов? В чем разница?
function f(x) {
return x + 1
}
try {
void [1, 2, { valueOf() { throw new Error } }].map(f)
} catch (e) {
console.log(e.stack)
}