Предыдущие слова
В большинстве случаев основная причина, по которой мы сбиты с толку в области масштаба, заключается в том, что мы не можем различить, следует ли выполнять переменные поиски в вложенном порядке положений функции или в порядке вызовов функций. В сочетании с вмешательством этого механизма, переменный поиск очень подвержен ошибкам. Это фактически вызвано двумя рабочими моделями. Прицел делится на лексическую область и динамический объем. Различив эти две модели объема, вы можете иметь четкое понимание процесса поиска переменных. Эта статья является второй главой серии JavaScript Series - Lexical Scope и Dynamic Scope
Лексическая область
Как упомянуто в первой статье, первая рабочая этап компилятора называется Word Cariety, которая разлагает строку, состоящую из символов в лексические единицы. Эта концепция является основой для понимания лексического объема
Проще говоря, лексическая область определяет область применения на лексической стадии, которая определяется тем, где переменные и объем блоков записываются при написании кода. Следовательно, область применения остается неизменной, когда лексический анализатор обрабатывает код.
связь
Независимо от того, куда называется функция, и независимо от того, как она называется, ее лексическая область определяется только положением, где функция объявлена.
function foo (a) {var b = a * 2; bar (c) {console.log (a, b, c);} bar (b * 3);} foo (2); // 2 4 12В этом примере есть три вложенных сферах. Чтобы понять, подумайте о них как о нескольких пузырьках, которые включают шаг за шагом
Пузырьки применения определяются тем, где записан их соответствующий код блока оцелев, и они включены шаг за шагом.
Bubble 1 содержит всю глобальную область, только с одним идентификатором: Foo
Bubble 2 содержит прицел, созданный Foo, который имеет три идентификатора: A, Bar и B
Bubble 3 содержит область применения, созданного BAR, только с одним идентификатором: C
Находить
Структура пузырьков с обрезками и их позиционных отношений предоставляют двигателю достаточную информацию о положении, которую двигатель использует для поиска местоположения идентификатора.
В фрагменте кода двигатель выполняет объявление Console.log (...) и ищет ссылки на три переменные A, B и C. Сначала он начинается с внутреннего объема, то есть сфера функции бара (...). Двигатель не может найти здесь, поэтому он перейдет на предыдущий уровень, чтобы продолжить поиск в сфере вложенного Foo (...). A найден здесь, поэтому двигатель использует эту ссылку. То же самое касается б. И для C двигатель нашел его в баре (...)
[Примечание] Поиск лексического прицела будет искать только идентификаторы первого уровня. Если код ссылается на foo.bar.baz, поиск по лексическому объему будет пытаться только найти идентификаторы Foo. После поиска этой переменной, правила доступа к атрибутам объекта приобретают доступ к атрибутам стержня и баз соответственно
foo = {bar: {baz: 1}}; console.log (foo.bar.baz); // 1Крышка
Поиск по объему начинается с самой внутренней области, при которой находится время выполнения, и идет шаг за шагом или вверх, пока не будет выполнено первое подходящее идентификатор.
Идентификаторы с тем же именем могут быть определены в многослойных вложенных областях, которые называются «эффектом окклюзии». Внутренние идентификаторы "окклюзируют" внешние идентификаторы
var a = 0; function test () {var a = 1; console.log (a); // 1} test ();Глобальные переменные являются автоматически атрибутами глобальных объектов, поэтому к ним можно получить доступ непосредственно посредством ссылки на атрибуты глобальных объектов, а не напрямую проходить через лексическое имя глобального объекта.
var a = 0; function test () {var a = 1; console.log (window.a); // 0} test ();Этот метод допускает доступ к глобальным переменным, которые скрыты переменными с теми же именем. Но если неглобальные переменные заблокированы, к ним нельзя получить доступ, несмотря ни на что.
Динамическая область
JavaScript использует лексическую область, и его наиболее важной функцией является то, что его процесс определения происходит на этапе написания кода.
Тогда зачем вводить динамическую область? На самом деле, динамический объем является еще одним важным механизмом JavaScript для двоюродного брата. Большая часть путаницы с охватом заключается в том, что лексический примен
Динамические прицелы не заботятся о том, как функции и прицелы объявляются и объявляются где угодно, только откуда они вызываются. Другими словами, цепочки объема основаны на стеке вызовов, а не в гнездовании областей в коде.
var a = 2; function foo () {console.log (a);} bar () {var a = 3; foo ();} bar ();[1] Если он находится в лексической области, это текущая среда JavaScript. Переменная a сначала выполняется в функции foo (), но она не найдена. Так что следуйте цепочке областей, чтобы найти поиск в глобальном объеме, найти и присвоить значение 2. Таким образом, консоль выводит 2
【2】 Если он находится в динамическом прицеле, аналогично, переменная a сначала выполняется в foo () и не найдена. Здесь вы будете следить за стеком вызовов для поиска в месте, где вызывается функция foo (), то есть функция bar (), найти и назначить значение 3. Поэтому консоль выходы 3
Резюме: Разница между двумя областями. Короче говоря, лексическая область определяется во время определения, в то время как динамическая область определяется во время выполнения.
Вышеуказанное является второй частью лексического прицела и динамического прицела, введенной редактором для вас. Я надеюсь, что это будет полезно для вас. Если вы хотите узнать больше, обратите внимание на wulin.com!