Во -первых, ниже приведены три кода, которые объясняют область применения
// ========== Пример 1 ============= VAR Scope = 'Global'; function fn () {alert (scope); var scope = 'local'; Alert (Scope);} fn (); // результат вывода? Alert (Scope); // Результат вывода? // =========== Пример 2 ============ VAR Scope = 'Global'; function fn () {alert (scope); Scope = 'Local'; Alert (Scope);} fn (); // результат вывода? Alert (Scope); // Результат вывода? // =========== Пример 3 =========== VAR Scope = 'Global'; function fn (Scope) {Alert (Scope); Scope = 'Local'; Alert (Scope);} fn (); // результат вывода? Alert (Scope); // Результат вывода?Эти три кода имеют лишь небольшую разницу, но результаты совершенно разные. Пример 1 выходы [неопределенные, локальные, глобальные], пример 2 выходы [глобальные, локальные, локальные], пример 3 выходы [неопределенные, локальные, глобальные]. Если вы не можете ответить правильно, это означает, что вы еще не поняли характеристики масштаба JavaScript.
Что такое масштаб?
Кто -то может спросить: какова сфера действия переменной А? Я спросил еще раз позже: какова область функции? Каковы области переменных и функций?
Давайте сначала посмотрим на то, что означает «область». Когда «область» разрушается, это означает «функционирование» и «домен»
Область - это доступный диапазон переменных и функций, или область, в которой работают переменные или функции.
1. Скора функции JavaScript:
Область в функции является областью объема функции, и как переменные, так и функции могут получить доступ к операциям в этой области. Область за пределами самой внешней функции называется глобальной областью, а область внутри функции называется локальной областью.
2. Объем переменных JavaScript:
В регионе, где переменная находится в исходном коде, область этой переменной является, и переменная может быть доступна и эксплуатирована в этой области. Переменные, определенные в глобальной области, называются глобальными переменными, а переменные, определенные в функции, называются локальными переменными.
Чтобы просто понять, исходный код JS делится на области блока по функции {}. Если эти области изменяют их идентичность, они являются областью определенной функции или определенной переменной. Объем переменной и объем функции могут относиться к той же области в исходном коде.
Цепочка применения
Цепочка областей - это переменная и механизм поиска функций в JavaScript. Он определяет объем переменных и функций, то есть сфера. Поймите принцип цепочки объема, и вы можете понять три примера в предыдущей статье, чтобы вы могли узнать причину и причину.
Цепочка областей-это концепция в документации ECMAMSCRIPT-262. Двигатель JavaScript реализуется в соответствии с документацией ECMASCRIPT-262. Понимание принципа работы двигателя JavaScript способствует нашему пониманию характеристик JavaScript, но большинство программистов JS не поймут очень базовые технологии. Поэтому при чтении документации ECMASCRIPT-262 мы можем иметь интуитивно понятный способ имитации принципа работы двигателя JavaScript.
В этой статье будет объяснен принцип формирования цепочек объемов в третьем издании ECMASCRIPT-262-3-й в 1999 году, и введет несколько концепций, таких как среда выполнения, переменные объекты и активные объекты, объекты аргументов, цепочки объема и т. Д. В 2009 году было опубликовано пятое издание ECMASCRIPT-262-5. Разница заключалась в том, что такие понятия, как переменные объекты и активные объекты, были отменены, и были введены новые концепции, такие как лексические среды и записи окружающей среды, поэтому не путайте концепции двух версий.
1. Исполнение контекстов
Контексты выполнения также переводятся в контекст выполнения. Когда анализатор входит в исполняемый код ECMascript, анализатор входит в среду выполнения. Активная среда выполнения образует логический стек. Среда выполнения в верхней части этого логического стека - текущая среда выполнения выполнения.
Примечание. Существует три типа исполняемого кода в Ecmascript, Global, Function и Eval. Глобальная среда - это глобальный исполняемый код, а функции - это исполняемый код функции. Логический стек представляет собой специальный формат хранения данных, характеризующийся «сначала и выходом, а затем в и выходе». Добавление данных сначала будет перенесено в верхнюю часть логического стека, а удаление данных должно быть удалено сверху.
С переменным объектом, активным объектом и объектом аргументов
Каждая среда выполнения имеет переменный объект, связанный с ним. Когда анализатор входит в среду выполнения, будет создан объект переменной, который содержит ссылки на переменные и функции, объявленные в текущей среде выполнения.
Переменный объект является абстрактной концепцией. В разных средах выполнения объекты переменных имеют разные идентичности. До того, как анализатор вступит в какую -либо среду выполнения, создается глобальный объект. Когда анализатор входит в глобальную среду выполнения, глобальный объект выступает в качестве объекта переменной. Когда анализатор вступает в функцию, активный объект будет создан как объект переменной.
2. Два этапа, когда анализатор обрабатывает код
Мы все знаем, что JavaScript Parser Sackser анализирует код один за другим, это коврик? Это включает в себя два этапа, когда анализатор обрабатывает код, анализируя код и выполняя код.
Когда анализатор вступает в среду выполнения, объект переменной добавит переменные и функции, объявленные в среде выполнения как его свойства, что означает, что переменные и функции доступны перед объявлением, а значение переменной не определен. Это является причиной продвижения переменных и объявлений функций (подъем). В то же время цепочка применения и это определяются. Этот процесс является стадией синтаксического анализа, широко известной как предварительная переписка. Затем анализатор начинает выполнять код, добавляет ссылку на соответствующее значение переменной и получает результат выполнения. Этот процесс является этапом выполнения.
Давайте назовем два вкусных каштана:
var a = 123; var b = "abc"; function c () {alert ('11 ');}После анализа и выполнения кода в вышеуказанной глобальной среде глобальный объект будет использоваться в качестве объекта переменной, а следующие данные будут сохранены.
функция testfn (a) {var b = "123"; функция C () {alert ("ABC"); }} testfn (10);Когда анализатор вступает в среду выполнения функции, активный объект будет создан как объект переменной. Активный объект также создаст объект аргументов. Объект аргументов - это параметр, установленный для сохранения параметров. Вот почему мы можем использовать аргументы [0] и так далее при написании функций.
3. Цепочка применения
Каждая среда исполнения имеет цепочку сфера, связанную с ней. Это определяется, когда анализатор входит в среду выполнения. Цепочка областей - это список объектов, используемый для извлечения переменных и функций в каждом объекте переменной. Это гарантирует, что среда выполнения имеет право доступа к тому, какие переменные и функции. Например, это каштан.
var a = '123'; function testfn (b) {var c = 'abc'; function testfn2 () {var d = 'efg'; предупреждение (а); } testfn2 ();} testfn (10);Переменная A не объявлена в TestFN2. Почему TestFN2 может вызвать глобальную переменную A? Как произошел весь процесс? Пожалуйста, смотрите изображение ниже.
Когда анализатор входит в глобальную среду выполнения, переменные и функции обнаруживаются только в глобальном объекте при их вызове.
Когда анализатор входит в среду выполнения функции TestFN, внутреннее свойство функции [[[Scope]] сначала заполняется в глобальном объекте, а затем активный объект TestFN добавляется к глобальному объекту, чтобы сформировать цепочку объема.
Когда анализатор вступает в среду выполнения функции TestFN2, внутреннее свойство функции [[[Scope]] сначала заполняется в родительской цепочке областей, а затем текущий активный объект TESTFN2 добавляется к переднему конце цепочки объема, чтобы сформировать новую цепь объема.
Когда TestFN2 вызывает переменную A, сначала найдите в текущем активном объекте TestFN2. Если это не найдено, следуйте цепочке применения вверх. Если это не найдено, посмотрите цепочку прицелов. Если это не найдено, посмотрите цепочку прицелов, пока она не найдена в последнем глобальном объекте, в противном случае будет сообщена ошибка. Следовательно, переменные внешней среды могут быть вызваны внутри функции, а переменные внешней среды не могут быть вызваны внутри функции. Это принцип характеристик масштаба.