#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. Из второго получить некое представление о внутренней работе рантайма (например понять, что весь скрипт не будет выполнен, если синтаксический анализатор забракует даже его последнюю строчку).
Комментариев нет:
Отправить комментарий