Недавно я перечитываю "JavaScript Advanced Programming 3" и чувствую, что я должен написать некоторые блоги, чтобы записать некоторые знания, которые я узнал, иначе я забуду это. Сегодня я хочу суммировать среду исполнения JS и масштабы.
Во -первых, давайте поговорим о среде исполнения
1. Среда исполнения
Концепция в книге, среда выполнения определяет другие данные, к которым имеют доступ или функции, и определяет их соответствующее поведение. Каждая среда выполнения имеет переменный объект, связанный с ним. Все переменные и функции, определенные в среде, хранятся в этом объекте. Хотя мы не можем получить доступ к этому объекту при написании кода, анализатор будет использовать его в фоновом режиме при обработке данных.
Среда выполнения - это концепция, механизм, который определяет, имеет ли переменная или функция разрешение на доступ к другим данным
В JavaScript исполняемый код JavaScript разделен на три типа:
1. Глобальный код, то есть глобальный код, который не является в какой -либо функции, такой как: файл JS, код JS, встроенный в HTML -страницы и т. Д.
2. Eval Code, то есть код JS, который динамически выполняется с помощью функции eval ().
3. Функциональный код, то есть код корпуса функции JS в определенных пользовательских функциях.
Пропустите код Eval и расскажите только о глобальной среде выполнения и среде выполнения функций.
1. Глобальная среда:
Глобальная среда является наиболее периферической средой исполнения. Глобальная среда выполнения считается оконным объектом. Следовательно, все глобальные переменные и функции создаются как свойства и методы оконных объектов. Когда код загружается в браузер, создается глобальная среда выполнения (глобальная среда выполнения разрушается только тогда, когда мы закрываем веб -страницу или браузер). Например, на странице создайте глобальную среду выполнения, когда код JS загружается в первый раз.
Вот почему закрытие имеет недостаток утечки памяти. Потому что внешние функции в закрытии рассматриваются как глобальная среда. Таким образом, он не будет уничтожен и будет сохранен в памяти.
2. Среда выполнения функций
Каждая функция имеет свою собственную среду выполнения. Когда выполнение вступает в функцию, среда выполнения функции будет выдвинута на вершину стека среды выполнения и получить права на выполнение. Когда эта функция выполняется, ее среда выполнения удаляется из вершины стека, а право выполнения возвращается в предыдущую среду выполнения. Это поток выполнения в программе Ecmascript.
Это также может быть интерпретировано таким образом: когда вызывается функция JavaScript, функция введет среду выполнения, соответствующую функции. Если вызывается другая функция, создается новая среда выполнения, и процесс выполнения находится в этой среде во время вызова функции. Когда вызовая функция возвращается, процесс выполнения возвращается в исходную среду выполнения. Поэтому запуск кода JavaScript образует стек среды выполнения.
Когда вызывается функция, создается локальная среда функции (после выполнения кода в функции, среда разрушается, и все определения переменных и функций, хранящихся в нем, также разрушаются).
2-1 Период определения
Когда функция определена, будет создан атрибут [[[Scope]]. Этот объект соответствует списку объектов. Объекты в списке могут быть доступны только внутри JavaScript и не могут быть доступны через синтаксис.
(Область означает область применения.)
Мы определяем глобальную функцию A, а затем функция A создает атрибут A [[Scope]]. В настоящее время [[[Scope]] содержит только глобальный объект [Global Object].
Если мы определим функцию B внутри A, то функция B также создаст атрибут [[[Scope]]]. Атрибут B [[[Scope]] содержит два объекта, один из них является активным объектом A Active Activation Activation, а другой - глобальный объект. Активный объект A находится впереди, и глобальный объект находится сзади.
Короче говоря, порядок списка объектов в свойстве [Scope] функции является объектом активации объекта предыдущего уровня функции, а затем верхнего уровня, вплоть до самого внешнего глобального объекта.
Вот пример кода: A имеет только одну область, у B имеет две области
// Функция внешней функции a () {var somevar; // Функция внутренней функции b () {var somevar; }}2-2 период исполнения
Когда функция выполняется, она входит в среду выполнения функции. Во -первых, он создает свой собственный активный объект [объект активации] (этот объект содержит определение этого, аргументы, локальные переменные (включая названные параметры) и цепочку применения переменного объекта. Затем скопируйте объем среды выполнения в [[цепь областей сферы], и, наконец, подтолкнуть активный объект к вершине [[цепь с области области]]. Объекты, которые имеют разрешение на доступ к среде выполнения.
// Первый шаг - создать глобальную среду выполнения. Глобальный контекст исполнения и объекты глобальной деятельности. // Определите глобальные [[[Scope]]], который содержит только окно -объекты // Сканировать переменные глобального определения и функциональные объекты: цвет 【Неопределенный】, ChangeColor 【FD создает ChangeColor [[[Scope]], который содержит только глобальные объекты активности], которые добавляются в окно, поэтому глобальные переменные и объекты глобальной функции определяются в качестве проведений. // Программа была определена, поэтому ChangeColor () может быть выполнена в любом месте в этой среде выполнения. The color has also been defined, but its value is undefined// The second step is color assigning "blue"var color = "blue";// It does not require assignment, it refers to its own function changecolor() { // The fourth step enters the execution environment of changecolor// Copy the changecolor [[scope]] to the scope chain // Create active objects, scan to define variables and define functions, Другое количество 【неопределенных】 и монтажных ролей 【FD создает Swapcolors [[[Scope]] и добавляют активные объекты и глобальные активные объекты】 к активным объектам, а также добавляют аргументы, и эти активные объекты выдвигают топ цепочки с надписью // Программа была определена, поэтому Swapcolors () могут выполняться в этой среде выполнения. Другой коррор был определен, но его значение не определен // пятое другое назначение "Red" var wornecolor = "red"; // Он не требует назначения, он относится к своей собственной функции swapcolors () {// step 7 Введите среду выполнения Swapcolors и создает его активный объект // Копировать Swapcolors '[[[Scope]] в цепочке области // Сканировать, чтобы определить переменные и определить функции объектов, добавить переменные. Значение назначения TempColor OtherColor, другое, будет найдено вдоль цепочки объема и продолжать выполнять var tempcolor = inomecolor; re-comoncolor = color; color = tempcolor; } // Шаг 6: Выполните SwapColors и введите его среду выполнения swapcolors ();} // Шаг 3: Выполнить ChangeColor и введите его среду выполнения ChangeColor ();2-3 Идентификатор доступа:
Когда идентификатор встречается во время выполнения кода JS, он будет искать в цепочке сфера контекста выполнения (контекст выполнения) на основе имени идентификатора. Начиная с первого объекта цепочки объема (объект объекта активации функции), если она не найдена, найдите следующий объект в цепочке сфера и повторите, пока не будет найдено определение идентификатора. Если последний объект в сфере областей не найден после поиска поиска, то есть глобальный объект (Global Object), будет выброшена ошибка, что вызвало неопределенную.
2. Цепочка применения/прицела (цепочка по применению/цепочке применения)
Когда код выполняется в среде, создается цепочка областей. Цель цепочки объема состоит в том, чтобы обеспечить упорядоченный доступ ко всем переменным и функциям, которые имеют разрешение на доступ к среде выполнения. Вся цепочка областей - это связанный список, построенный с помощью объектов переменных в разных местах выполнения в соответствии с правилами. Передний конец цепочки объема - это всегда вариабельный объект в среде, где расположен в настоящее время выполняемый код.
Если эта среда является функцией, его объект активации используется в качестве объекта переменной. Активный объект содержит только одну переменную в начале, которая является объектом аргументов внутри функции. Следующий объект переменной в цепочке областей поступает из среды включения функции, а следующий объект переменной поступает из следующей среды включения. Таким образом, он продолжает глобальную среду выполнения, а объект переменной глобальной среды выполнения всегда является последним объектом в цепочке областей.
Как показано на рисунке:
Примеры в книге:
var color = "blue"; function ChangeColor () {var nothercolor = "red"; функция swapcolors () {var tempcolor = nothercolor; re-comoncolor = color; color = tempcolor; // todo что -то} swapcolors ();} ChangeColor (); // Tempcolor и Anocolor не могут быть доступны здесь; но цвет можно получить; предупреждение («Цвет теперь»+цвет);Благодаря вышеуказанному анализу мы можем знать, что внутренняя среда может получить доступ ко всем внешним средам через цепочки объема, но внешняя среда не может получить доступ к каким -либо переменным и функциям во внутренней среде.
Эти среды являются линейными и упорядоченными. Каждая среда может искать цепочки объема вверх, чтобы запросить переменные и имена функций; Тем не менее, любая среда не может ввести в другую среду выполнения, иская цепочки объема вниз.
Для функции SwapColor () в приведенном выше примере ее цепочка областей включает в себя: variable -объект SwapColor (), объект переменной changeColor () и глобальный объект. Локальная среда Swapcolor () начинает искать переменные и имена функций в своем собственном объекте переменной. Если его нельзя найти, найдите цепочку сферы действия Chamencolor вверх. Полем Полем Полем Полем И так далее. Однако функция ChangeColor () не может получить доступ к переменным в SwapColor
Откровение: попробуйте использовать локальные переменные, чтобы сократить время поиска
1. Без применения на уровне блоков
В отличие от C, C ++ и Java, JavaScript не имеет сферы на уровне блоков. Посмотрите на следующий код:
if (true) {var myvar = "Zhang San"; } alert (myvar); // Zhang SanЕсли есть область на уровне блока, Myvar не может быть доступен снаружи. Посмотрите на следующее
for (var i = 0; i <10; i ++) {console.log (i)} alert (i); // 10Для языков с объемом на уровне блока, таких как Java или C# Code, я является переменной, инициализированной, и не могу получить доступ снаружи. Поскольку я существует только в весе для петли, после запуска петли для цикла, все переменные в FO разрушаются. Это не тот случай в JavaScript. Объявление переменной будет добавлено в текущую среду выполнения (вот глобальная среда выполнения). Следовательно, после завершения цикла FO, переменная, которую я все еще существует в среде выполнения за пределами цикла. Следовательно, 10 будет выходным.
2. Объявите переменные
Когда переменная объявляется с использованием VAR, эта переменная будет автоматически добавлена в ближайшую доступную среду. Для внутренней части функции ближайшая среда - локальные переменные функции. Если переменная не инициализирована, переменная автоматически добавляется в глобальную функцию.
Код заключается в следующем:
var name = "xiao ming"; function getName () {alert (name); // 'неопределенное' var name = 'xiao huang'; оповещение (имя); // xiao huang} getName ()Почему первое имя не определен? Это связано с тем, что анализатор JavaScript входит в среду выполнения функции и сначала сканирует VAR и функцию.
Это эквивалентно продвижению объявления VAR или функции [Объявление функции] в верхней части среды выполнения.
Другими словами, при введении нашей функции GetName механизм поиска идентификатора находит VAR, а имя - это имя локальной переменной, а не глобальное имя, потому что имя в функции продвигается вверху.
Приведенный выше код будет проанализирован следующим образом:
var name = "xiao ming"; function getName () {var name; оповещение (имя); // 'неопределенное' var name = 'xiao huang'; оповещение (имя); // xiao huang} getName ()Расширить цепочку сфера:
Хотя существует только два типа среды выполнения - глобальные объемы и функциональный объем, цепочка областей по -прежнему может быть продлена каким -либо образом. Потому что некоторые утверждения могут добавить временный объект переменной в верхнюю часть цепочки объема.
Есть две ситуации, когда это происходит:
1. блок улова оператора Try-Catch;
2. с утверждением;
Выше всего об этой статье. Я надеюсь, что для всех будет полезно изучать и понять среду выполнения JavaScript и сферу охвата.