Лексическая область действия функции создается во время "компиляции" области этой функции (если эта функция объявлена в глобальной области, эта область является глобальной областью), или во время "оценки" этой функции, или во "время выполнения" этой функции? Какой из этих? Я уже знал, что внутренний слот [[Environment]] определяется во время компиляции, и когда функция выполняется, лексическое окружение этой функции ссылается на [[Environment]]. Поэтому я думаю, что окружающее состояние функции выделяется во время компиляции области функции. В соответствии с этим область внешней среды создается во «время компиляции», а область внутренней среды (environmentRecord) создается во «время выполнения» этой функции, я думаю. Это правильно?
Когда создается лексическая область действия функции в Javascript?
1 июля 2021 в 17:07
40
0
Это деталь реализации.
Для JavaScript не существует (концептуально) «времени компиляции». Это интерпретируемый язык. Существуют интерпретаторы, в которые включен шаг компиляции, но они не являются стандартными. Кроме того, этап компиляции будет прозрачным с точки зрения происходящих логических операций. Например, компиляция не изменит результат того, что происходит, в лучшем случае она изменит скорость.
@Barmar Не могли бы вы подробнее объяснить детали реализации?
Детали реализации — это то, что зависит от того, как написан интерпретатор/компилятор JavaScript, а не то, что требуется языком или видно коду приложения. Программист JavaScript может сделать это любым способом, пока будет получен требуемый результат.
@VLAZ Если нет «времени компиляции», что мы должны назвать «фазой (шагом) сбора информации о переменных, которая находится в контексте выполнения»? (что вызывает подъем)
@vriznet это часть выполнения кода. Стратегия известна как двухпроходный интерпретатор — первый проход будет читать файл и готовиться к выполнению (это когда происходит подъем — подготовка включает в себя создание переменных, а также проверку синтаксиса), затем второй проход — традиционный « читать и выполнять построчно», но это также будет использовать подготовку.
@VLAZ Спасибо за ответ, и я понял. Не могли бы вы сказать мне, когда создается лексическая область видимости функции? («время подготовки» или «время выполнения» переводчиком)
@ Бармар Спасибо. Поэтому, если вы знаете о поведении движка V8, пожалуйста, сообщите мне, когда создается лексическая область видимости функции, предполагая, что интерпретатор/компилятор - это V8.