#javascript #ecmascript
На learn.js написано:
Выполнение скрипта происходит в две фазы:
На первой фазе происходит инициализация, подготовка к запуску.
Во время инициализации скрипт сканируется на предмет объявления
функций вида Function Declaration, а затем – на предмет объявления
переменных var. Каждое такое объявление добавляется в window.
Функции, объявленные как Function Declaration, создаются сразу
работающими, а переменные – равными undefined.
На второй фазе – собственно, выполнение.
Присваивание (=) значений переменных происходит, когда поток
выполнения доходит до соответствующей строчки кода, до этого они
undefined.
А также мне отвечали на stackoverflow, что:
Работа любого скрипта в javascript состоит из двух фаз. Первым
вступает в дело синтаксический анализатор, который просматривает весь
входной текст и подготавливает скрипт к выполнению, переводит его во
внутреннее представление. На второй фазе это внутреннее представление
начинает выполняться.
Верно ли, что речь идет об одних и тех же фазах?
Если да, значит в первой фазе работает не только синтаксический анализатор, но и
происходит инициализация?
Расталкуйте пожалуйста, какие фазы есть вообще? И что происходит во время каждой фазы?
Ответы
Ответ 1
Сам же пишешь: Работа любого скрипта в javascript состоит из двух фаз. Первым вступает в дело синтаксический анализатор, который просматривает весь входной текст и подготавливает скрипт к выполнению, переводит его во внутреннее представление. На второй фазе это внутреннее представление начинает выполняться. Выполнение скрипта происходит в две фазы Итак. Верно ли, что речь идет об одних и тех же фазах? Нет. Одна фаза синтаксического анализа и ещё две фазы выполнения. Если да, значит в первой фазе работает не только синтаксический анализатор, но и происходит инициализация? Нет, это невозможно. Во-первых, скрипт может вообще не выполняться, если в нём синтаксическая ошибка: try { console.log(never executed) } catch (e) { console.log("And this is never executed too") } Во-вторых, все переменные принадлежат выполняющейся функции и каждый её запуск порождает новый комплект переменных. А при парсинге функция вообще не выполняется. Возможно, она вообще никогда и не выполнится. function f() { var a = Math.random() return () => a } var f1 = f(), f2 = f() console.log(f1(), f2()) // Они разные Расталкуйте пожалуйста, какие фазы есть вообще? И что происходит во время каждой фазы? Вроде как это все. И ещё кое-что: Каждое такое объявление добавляется в window. window тут только для кода, расположенного непосредственно на верхнем уровне (не в функциях).Ответ 2
Речь идет о разных фазах. В первом определении описывается поведение переменных в фазах выполнения скрипта. Во втором определении описывается внутренний механизм реализации конкретного рантайма. Обе фазы из первого определения происходят во второй фазе второго (выполнение). Нет, в первой фазе первого определения синтаксический анализатор большинства рантаймов закончил свою работу и идет выполнение скомпилированного кода. Любой процесс можно поделить на какие-то фазы в зависимости от назначения этого деления. Из первого определения мы можем понять, что будет если обратиться к переменной до ее описания в var. Из второго получить некое представление о внутренней работе рантайма (например понять, что весь скрипт не будет выполнен, если синтаксический анализатор забракует даже его последнюю строчку).
Комментариев нет:
Отправить комментарий