Я изучаю JavaScript, но многого не понимаю. На одном онлайн-викторине по JavaScript появился следующий вопрос:
Что следующий код JavaScript выведет на консоль:
const a = {};
const b = () => a.a = () => {};
const c = c => '' + c + a.a(b());
const d = console.log.bind(console);
const e = (e => () => d(c(e++)))(0);
try{
e();
}catch(a){
e();
}
Мне потребовалось некоторое время, чтобы понять, что означает каждая переменная (здесь константа). Я начал анализировать код с блока e()
внутри try
. Итак, e
представляет замыкание, а это значит, что функция d
будет вызываться с аргументом c(0)
, а e
станет 1
. Как я понял, здесь d
в основном представляет собой функцию console.log
(но я не могу понять, почему они использовали bind
?).
На данный момент я знаю, что сначала будет выполнено c(0)
, а затем результат будет записан в консоль, верно? Давайте посмотрим на функцию c
. Он возвращает первый аргумент, преобразованный в строку, и конкатенированный результат a.a(b())
. Итак, a.a(b())
будет выполнено первым, я прав? Но проблема в том, что a.a
не является функцией, она не определена, поэтому будет выдана ошибка, и мы перейдем к catch
.
Теперь в блоке catch
все должно быть так же, поэтому a.a
все еще не является функцией и должна выдаваться ошибка ссылки. Но меня удивило, когда я увидел, что никакой ошибки не выдается, но консоль на самом деле регистрирует 1undefined
. Почему? Как?
Хорошо, немного подумав, я понял, что, возможно, при вызове a.a(b())
сначала выполняется b()
. Следуя моему предположению, тогда функция b
присваивает ссылку на функцию, которая ничего не делает со свойством a
объекта a
, верно? Но тогда a.a
ЯВЛЯЕТСЯ функцией, и она будет выполняться в блоке try
, а 0undefined
будет логироваться.
Однако ни одно из этих двух предположений не верно. Главный вопрос здесь заключается в том, что выполняется первым? Если мы позвоним someObject.propertyWhichIsNotAFunction(somethingWhichMakesItAFunction)
, что произойдет? Что выполняется в первую очередь? Кажется, что в блоке try
сначала выполняется одно, а в блоке catch
другое. Это действительно не имеет смысла для меня. Любые объяснения?