Давайте сначала поговорим о том, что такое сегментация слов. Сегментация слов заключается в разложении строки символов на блоки кода, которые имеют значение для языка программирования. Эти блоки кода называются токенами. Например, код var a = 2
будет разложен на следующие лексические единицы. В частности: var,a,=,2.
Примечание. Сегментация слов на самом деле заключается в разделении всего приведенного выше кода на сегменты.
Синтаксический анализ заключается в преобразовании потока лексических единиц в дерево, состоящее из элементов, вложенных уровень за уровнем, которое представляет грамматическую структуру программы. Это дерево называется абстрактным синтаксическим деревом. Ввиду слишком длинных стандартных слов здесь мы их рассматривать не будем, я сразу отобразю их в более интуитивно понятном виде. Подробности следующие:
Анализ: Дерево абстрактного синтаксиса будет иметь узел верхнего уровня var, за которым следуют дочерний узел с переменной a и узел с оператором присваивания =. Под символом присваивания имеется еще один дочерний узел 2. В частности, это соответствует коду var a = 2
.
Процесс преобразования абстрактного синтаксического дерева в исполняемый код называется генерацией кода. Этот процесс тесно связан с языком и целевой платформой. Проще говоря, существует способ преобразовать абстрактное синтаксическое дерево var a = 2
в машинные инструкции. Используется для создания переменной с именем a и сохранения значения в ней.
в основном полагаются на механизм выполнения кода JavaScript. Когда механизм выполняет var a = 2, он определяет, была ли объявлена переменная a, путем ее поиска. Процессу поиска помогают области видимости. В процессе запроса механизм будет выполнять LHS (левый запрос) для переменной a и правый запрос для значения. Проще говоря, когда переменная появляется слева от операции присваивания, выполняется запрос LHS, а когда она появляется справа, выполняется запрос RHS. Точнее, запрос LHS пытается найти контейнер самой переменной, а запрос RHS пытается получить ее исходное значение.
Примечание. В функции будут запросы как LHS, так и RHS. Потому что в процессе передачи параметров код будет выполнять неявное присваивание.
Если переменная не объявлена, поведение запроса LHS и запроса RHS различно.
функция foo(a){ console.log(а+б); b=a;}foo(2)
Примечание. Первый правый запрос к b не может найти переменную. Это означает, что это необъявленная переменная, поскольку ее нельзя найти ни в одной соответствующей области. Если RHS не может найти необходимые переменные во вложенной области видимости, механизм выдаст исключение.
6. Функцияfoo(a){ вар б=а; вернуть а+б; }Проблема
var c=foo(2)
: найти все запросы LHS и RHS
Ответ: LHS(c=…,a=2,b=…) и RHS(foo(2…,=a,a…,…b))