На каждом языке программирования его переменные имеют определенный достоверный диапазон. После превышения этого диапазона переменные станут недействительными. Это сфера действия переменной. С математической точки зрения, это область независимых переменных.
Область - это доступный диапазон переменных, то есть область управления наглядностью и жизненным циклом переменных и функций. В JavaScript объекты и функции также являются переменными, а переменные определяются внутри тела произвольной функции, вложенного в раскрывающем их функциональном органе и организованном теле функции.
1. Статическая область и динамическая область
Статическая область
Это означает, что объем объявления определяется во время компиляции на основе тела программы, также известного как лексическая область. Большинство современных языков программирования принимают статические правила объема, и JavaScript принимает этот объем.
На языках, которые используют статические прицелы, в основном являются внутренние вложенные правила объема: идентификатор, введенный в результате объявления, видна в сфере действия, где находится объявление, а также в каждом сфере, вложенном внутри, если только оно не покрывается другим объявлением того же идентификатора, вложенного внутри.
Чтобы найти объект, на который ссылается заданный идентификатор, его следует найти в текущей внутренней области. Если обнаружено объявление, можно найти объект, на который ссылается идентификатор. В противном случае мы будем искать в прямой внешней областях и продолжать проверять внешнюю область, чтобы снаружи, пока не достигнем самого внешнего уровня гнездования программы, то есть сфера, где находится глобальное объявление объекта. Если объявление не найдено на всех уровнях, то программа имеет ошибку. следующее:
function cha () {var name = "xiao;" function chb () {function chc () {console.log (name); }}}Во -первых, функция ищет определение имени от chb (), а затем продолжает искать слой по слою. Наконец, определение имени найдено в cha (). Если это не найдено, будет сообщена ошибка.
2. Динамическая область
На языке динамически охвата объект, на которую ссылается переменная в программе, определяется на основе информации о потоке управления программой в момент работы программы.
2. Объем JavaScript
В JavaScript есть две области, а именно глобальная область и локальный объем.
1. Глобальный объем
В любом месте кода есть определение. Даже если глобальная переменная определена в кусочке кода JS, вложенной на HTML -странице, переменная все еще можно получить в указанном файле JS. Это очень вероятно, что приведет к загрязнению глобальных переменных.
Переменные в следующих трех случаях будут считаться глобальными переменными
(1) Самая внешняя функция и самая внешняя переменная имеют глобальную область
(2) переменные, которые назначаются непосредственно без определения, автоматически объявляются, что имеют глобальный объем
(3) Свойства всех оконных объектов имеют глобальный объем
2. Местная сфера
Обычно можно получить доступ только в фиксированных фрагментах кода, таких как переменные внутри функций (область функции)
var name = "xuxiaoping"; function echoname () {var firstname = "xu"; // локальная область SecondName = "xiao"; // Глобальная функция сферы echofirstname () {console.log (первое имя); // xu} console.log (secondname); return echofirstname;} console.log (name); // Глобальная область сферы var f = echoname (); f (); console.log (firstname); console.log (secondname);Результат:
Xuxiaoping
Сяо
XU // Внутренняя функция может получить доступ к переменным внешней функции
Неоплачиваемые // Внутренние переменные функции не могут быть доступны вне функции
Сяо
JavaScript прикрепляет глобальные переменные к объектам окна и становится свойством окна объектов.
3. Функциональная область
Область на уровне блока: Любой набор операторов в брекетах принадлежит блоку, и все переменные, определенные в этом, невидимы за пределами блока кода. Большинство языков C-класса имеют области на уровне блоков.
Тем не менее, важной особенностью JavaScript является то, что он не имеет сферы на уровне блоков.
function echoi () {for (var i = 0; i <10; i ++) {; // console.log (i); } if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();Результатом вывода:
10
привет
Можно видеть, что вне оператора FO (или если, в то время как) переменная, которую я определил в блоке, все еще доступна. То есть JavaScript не поддерживает области на уровне блоков, он поддерживает только области функций, а переменные, определенные в любом месте функции, видны в любом месте этой функции. Как человек, который учится C и Java с самого начала, это немного сложно адаптироваться. Согласно моим тестам, то же самое относится и к PHP.
Конечно, вы можете использовать характеристики закрытия JavaScript, чтобы имитировать область на уровне блоков
function echoi () {(function () {for (var i = 0; i <10; i ++) {; // console.log (i);}}) (); if (true) {var str = "hello"; } console.log (i); console.log (str);} echoi ();Результат: я не определен
Это изолирует определение переменных. В JS, чтобы предотвратить конфликты именования, глобальные переменные и глобальные функции следует избегать как можно больше, такого рода закрытие используется во многих отношениях.
4. Жизненный цикл переменной JavaScript
Жизненный цикл переменной JavaScript инициализируется, когда он объявлен.
Локальные переменные разрушаются после выполнения функции.
Глобальные переменные уничтожаются после закрытия страницы.
3. Цепочка применения JavaScript
Это выглядит как цепь, его, вероятно, можно объединить с связанным списком в структуре данных.
В JavaScript функции - это объекты, но на самом деле все в JavaScript - это объекты. Функциональные объекты, как и другие объекты, имеют свойства, которые можно получить через код, и серию внутренних свойств, которые доступны только для двигателя JavaScript. Одним из внутренних свойств является [[[Scope]], определяется третьим изданием стандарта ECMA-262. Эти внутренние свойства содержат набор объектов в области применения, созданной функцией. Эта коллекция называется цепочкой функций областей, которая определяет, какие данные могут быть доступны функциями.
Когда функция создается, ее цепочка областей заполняется объектами данных, которые доступны в объеме функции. Например, определите такую функцию:
Функция add (num1, num2) {var sum = num1 + num2; вернуть сумму;}Когда создается добавление функции, глобальный объект будет заполнен в его цепочке областей, которая содержит все глобальные переменные, как показано на рисунке ниже (Примечание: изображение дает только некоторые из всех переменных):
Объем добавления функции будет использоваться во время выполнения. Например, выполните следующий код:
var total = add (5,10);
При выполнении этой функции создается внутренний объект, называемый «контекст выполнения». Контекст выполнения определяет среду, в которой выполняется функция. Каждый контекст выполнения имеет свою собственную цепочку областей для анализа идентификатора. Когда создается контекст выполнения, его цепочка областей инициализируется как объект, содержащийся в [[[Scope]] текущей функции запуска.
Эти значения скопированы в цепочке цепочки применения контекста времени выполнения в том порядке, в котором они появляются в функции. Вместе они формируют новый объект, называемый «объект активации», который содержит все локальные переменные, названные параметры, наборы параметров и эту функцию. Затем этот объект будет проткнут в переднюю часть цепочки прицела. Когда работающий контекст будет уничтожен, активный объект будет уничтожен. Новая цепочка областей показана на рисунке ниже:
Во время выполнения функции каждый раз, когда встречается переменная, будет проходить процесс анализа идентификатора, чтобы решить, где получить и хранить данные. Этот процесс начинается с головы цепочки применения, то есть ищет идентификатор одного и того же имени от активного объекта. Если это найдено, используйте переменную, соответствующую этому идентификатору. Если это не найдено, продолжайте искать следующий объект в цепочке применения. Если все объекты не найдены после поиска, идентификатор считается неопределенным. Во время выполнения функции каждый идентификатор должен пройти такой процесс поиска.
4. Цепочка областей и оптимизация кода
Из структуры цепочки прицела можно видеть, что в цепочке прицела контекста выполнения, тем глубже идентификатор, тем медленнее будет скорость чтения и записи. Как показано на рисунке выше, поскольку глобальные переменные всегда существуют в конце цепочки сфера контекста во время выполнения, самая медленно найти глобальные переменные при анализе идентификатора. Поэтому при написании кода вы должны попытаться использовать глобальные переменные как можно меньше и максимально использовать локальные переменные. Хорошим эмпирическим правилом является: если на объект поперечного шкафы ссылается более одного раза, храните его в локальной переменной перед использованием. Например, следующий код:
function ChangeColor () {document.getElementById ("btnChange"). OnClick = function () {document.getElementById ("targetCanvas"). style.backgroundcolor = "red"; };}Эта функция дважды относится к глобальному переменным документу. Переменная должна исходить через всю цепочку областей, пока она не будет обнаружена в глобальном объекте. Этот код может быть переписан следующим образом:
function ChangeColor () {var doc = document; doc.getElementbyId ("btnChange"). onclick = function () {doc.getElementById ("targetCanvas"). style.backgroundcolor = "red"; };}Этот код относительно прост и не будет демонстрировать огромное улучшение производительности после переписывания, но если большое количество глобальных переменных в программе будет доступно неоднократно, производительность кода после переписывания будет значительно улучшена.
5. С цепочкой смены
Соответствующий контекст времени выполнения уникален каждый раз, когда численность выполняется, поэтому вызов одной и той же функции несколько раз приведет к созданию нескольких контекстов времени выполнения. Когда функция выполнена, контекст выполнения будет уничтожен. Каждый контекст выполнения связан с цепочкой применения. Вообще говоря, во время работающего контекста его цепочка областей будет влиять только с оператором и оператором Catch.
Заявление с быстрым способом применения объектов, чтобы избежать написания дубликата кода. Например:
function initui () {с (document) {var bd = body, links = getElementsbytagname ("a"), i = 0, len = links.length; while (i <len) {update (ссылки [i ++]); } getElementbyId ("btninit"). onclick = function () {dosomething (); }; }}Используйте здесь операторы ширины, чтобы не писать документ несколько раз, что выглядит более эффективным, но на самом деле создает проблемы с производительностью.
Когда код заканчивается с оператором с помощью оператора, цепочка сферы контекста выполнения временно изменяется. Создается новый измененный объект, который содержит все свойства объекта, указанного параметром. Этот объект будет втянут в голову цепочки сфера, что означает, что все локальные переменные функции теперь находятся во втором объекте цепи сцепления, поэтому доступ дороже. Как показано на рисунке ниже:
Поэтому с помощью заявлений следует избегать в программах. В этом примере простое хранение документа в локальной переменной может повысить производительность.
Суммировать
1. Объем переменной - это то, где область действия переменной действителен.
2. Цепочка сферы переменных - это сбор объектов в созданной области.
Выше приведено в этой статье, я надеюсь, что для всех будет полезно изучить программирование JavaScript.