As For JS
3.26K subscribers
228 photos
24 videos
4 files
571 links
As For JavaScript...
Обсуждения — @AsForJsTalks
Download Telegram
#spec
Что такое Hoisting в рамках современной спецификации ECMAScript

Или что отвечать на собеседованиях.

Hoisting - это безграмотный жаргон закрепившийся в окружении JavaScript программистов, являющийся собирательным образом, для целой группы выражений таких как:
variable statement: var theVarThing = 1;
let/const declaration; let theLetThing = 2;
hoistable declaration ; function doThing() {};

и описывающий процесс, когда при формировании окружения, для выполнения кода функции, имена идентификаторов (theVarThing, theLetThing, doThing) которые используются этим окружением, должны быть заявлены в нем, ДО начала интерпретации кода.


Например:
function doThing() {
console.log( theThingA );
var theThingA = "AAAAAA";
}

Выполнение console.log не приводит к какой-либо, исключительной ситуации, потому что идентификатор theThingA уже был инициализирован значением undefined на момент старта интерпретации кода функции.

Именно этот процесс, и описывают безграмотным термином hoisting или всплытие.


Что говорит нам официальная спецификация
Официальная спецификация, содержит только один термин, с словосочетанием схожим со словом hoisting - это hoistable declaration.
Который касается только function declaration и только их. (В том числе производных, например генераторов_

Если бы, на уровне спецификации, существовал какой-то HOISTNG в той форме, в которой его спрашивают на собеседовании, то спецификация, обязана была бы включать в себя ВСЕ множество выражений - от var до function, а не только function.

В то же время спецификация описывает hoistable declaration СТРОГО КАК function declaration. Даже function expression не попадают под это определение.

Вместо ИГОГО
Никакого термина hoisting, в рамках официальной спецификации не существует, в той плоскости определения в которой его спрашивают на собеседовании. И никогда не существовало.

Есть группа выражений, содержащих ключевое слово function, поведение которых описано в спецификации под термом hoistable declaration. Под этим же термом нет И БЫТЬ не может никаких var let или const.

Процесс так называемого "всплытия", в спецификации, описан в стадии подготовки выполнения кода функции.
Подчеркиваю ПОДГОТОВКИ ВЫПОЛНЕНИЯ КОДА ФУНКЦИИ. той самой функции, которая оказывается hoistable declaration в том числе.


Краткий тезис -
если бы в спецификации был hoisting, как часть языка, то в нем бы описывалось все то, что привыкли спрашивать на собеседовании: var let const function

в то же время, в спецификации, есть термин hoistable который касается только function, и принципиально не может содержать var let или const.
👍33🔥159🤯3
#spec
Что такое макротаски (macrotask) в рамках современной спецификации ECMAScript.

В рамках спецификации ECMA, такого термина, или его производных - не существует и никогда не существовало.
Такой термин действительно был, но только в рамках спецификации HTML5, части, которая касалась EventLoop.

В настоящий момент времени, в раках стандарта HTML5 в его части EventLoopt, принято говорить о: Task Queue и microtask queue. Которые выполняют совершенно разные функции.

То есть, в былинные времена, термин маркотаски, описывал то, что сейчас описано спецификацией HTML5 как Task Queue. Или просто очередь задач.

При этом, существующий сейчас термин, вводит в заблуждение в той части, когда говорит про ОЧЕРЕДЬ.

Спецификация HTML5 прямо указывает, что это НЕ ОЧЕРЕДЬ,
Task queues are sets, not queues, because the event loop processing model grabs the first runnable task from the chosen queue, instead of dequeuing the first task.

не смотря на существующее название.


Первый промежуточный итог:
Термин макротаск - это термин который не имеет отношение к JavaScript.
Этот термин, использовался в прошлом, в формате спецификации HTML5.
В настоящий момент, этот термин не используется. Вместо него используется термин Task queues.
Про который нужно знать, что, не смотря на присуствие слова queue - он НЕ ОБОЗНАЧАЕТ очередь задач.
Но обозначает какой-то список, из которого значения могут браться в произвольном порядке. (превед свидетелям одно-поточного JavaScript)


Про что следует знать:
Согласно стандарту HMTL5, к каждому списку task queues, прикреплен microtask queue. Последний является именно очередью, которая, согласно спецификации, гарантирует порядок исполнения, в соответствии с порядком постановки в очередь.


Как это связано с JavaScript:
Это очень сложный основополагающий вопрос того, как в принципе обеспечивается работа языка JavaScript солгасно спецификации.
Если говорить в ОЧЕНЬ УПРОЩЕННОЙ форме, то для выполнения какого-либо JS кода, это код, нужно поставить как Task Queue. В процессе выполнения которой, некоторые из частей языка, например Promise, могут формировать задачи, которые попадают в MicroTask Queue.

Но при этом, неправильно думать, что эти термины касаются именно языка JavaScript, потому, что в форме спецификации ECMA эти же очереди, описаны иначе: Jobs Queue (которая так же не является очередью) и Promise Quueue.

Чтобы раскрыть связь терминов HTML5: TaskQueue / MicrotaskQuesu (спецификации HTML5) и GenericJob / PromiseJob нужен очень долгий разговор, поясняющий связ между имплементацией стандарта и HOST средой.


Вместо ИГОГО:
Когда речь заходит про что-то, что использует слово Task, первое что нужно уточнить - вы о каком стандарте говорите.
Так как в рамках ECMA, существование GenericJob и PromiseJob это одна разница, в то же время когда в HTML5 Task Queue и Microtask Queue совсем другая. Не смотря на то, что они могут сильно пересекаться.
🔥258👍4