Страницы

Поиск по вопросам

четверг, 2 января 2020 г.

Фазы работы скрипта js

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

Комментариев нет:

Отправить комментарий