Так называемый объем можно просто понять как прицел (область), которую можно прочитать и написано. Некоторые студенты с опытом работы в JS могут сказать: «JS не имеет масштаба на уровне блоков». В дополнение к глобальному объему, только функции могут создавать области. Одним из преимуществ объема является то, что он может изолировать переменные.
Мы используем несколько примеров, чтобы помочь нам понять сферу охвата в JS.
предупреждение (а); var a = 1;
Если студенты, которые вообще не знают охвата вообще, могут сказать, что оповещение составляет 1 или сообщает об ошибке; Но это на самом деле неопределенно;
Говоря об этом, давайте впервые поговорим о некоторых подготовках, сделанных до того, как JS -анализ кода по строке.
Прежде чем читать строку кода по линии, JS выполнит некоторую работу «предварительную работу» и найдет некоторые «мелочи» заранее. Конечно, «JS Parser» не найдет некоторые данные случайно, он найдет их в соответствии с VAR, функцией и параметрами.
«JS Parser» относительно «ленивый». Прежде чем официально запустить код, он назначит переменную, объявленную VAR, неопределенной, то есть var a = не определен; Он будет рассматривать всю функцию как блок кода, независимо от того, сколько кода есть. Параметры будут указаны в примерах позже.
После того, как все подготовки выполняются, «Переводчик JS» начинает выполнять строку кода по строке. Теперь давайте проанализируем пример, который мы начали, и легко понять, почему он не определен.
Давайте посмотрим на следующий пример
предупреждение (а); var a = 1; предупреждение (а); var a = 2; предупреждение (а);
Давайте немного проанализируем это
Первый «подготовка»: анализатор будет искать VAR
При чтении второй строки a = неопределенная;
При чтении четвертой строки все еще a = неопределенная;
Формальное выполнение кода по строке:
Оповещение первой линии: неопределенная
Вторая строка a = 1;
Строка 3 предупреждение: 1;
Пятый элемент оповещения: 2
Давайте посмотрим на пример ниже
предупреждение (а); var a = 1; предупреждение (а); функция a () {alert (2); } alert (a); var a = 3; предупреждение (а); функция a () {alert (4); } alert (a);Давайте проанализируем это немного
Во-первых, «Предварительная партия»: анализатор будет искать функцию VAR;
При чтении второй строки a = неопределенная;
При чтении четвертой строки a = function a () {alert (2);} // Все функции представляют собой весь блок функции, прежде чем официально запустить код; Когда переменная встречается с дубликатом имени, остается только одна переменная. Если переменная и функция являются дублированным именем, остается только функция.
При чтении шестой строки a = function a () {alert (2);}
При чтении восьмой строки a = function a () {alert (4);}
Формальное выполнение кода по строке:
Оповещение первой строки: функция a () {alert (4);}
Вторая строка a = 1; // Выражение может изменить предварительное значение!
Строка 3 предупреждение: 1;
Четвертая линия функции не называется, пропустить;
Пятый элемент оповещения: 1;
Строка шесть a = 3;
Строка 7 предупреждение: 3
Функция восьмой линии не называется, пропустить;
Строка 9 Оповещение: 3
Как показано на рисунке:
Продолжайте видеть пример:
var a = 1; function fn1 () {alert (a); // неопределенная var a = 2;} fn1 (); предупреждение (а); // 1Первый «Preparse»: анализатор будет искать функцию VAR
При чтении первой строки a = не определено;
При чтении второй строки fn1 = function fn1 () {alert (2); var a = 2;}
Формальное выполнение кода по строке: первая строка a = 1;
Вызов функции шестой строки, введите область функции и до сих пор предварительно перейти в область функции, а затем выполните ее по строке.
Подготовка в функции: a = не определен;
Исполнение: предупреждение: неопределенное;
a = 2; // а в настоящее время - только в области функции и не повлияет на глобальный
Функция выполняется и возвращается к глобальной области;
Строка Семи предупреждает: 1;
продолжать:
var a = 1; function fn1 () {alert (a); // 1 a = 2;} fn1 (); предупреждение (а); // 2Единственное различие между приведенным выше примером заключается в том, что в функции не есть VAR, и только анализирует ключевые точки.
В третьей строке оповещения (a), в области функции, поскольку в функции нет var a, «синтаксис» будет искать A для прицела верхнего уровня масштаба функции (определение взаимосвязи верхнего уровня и нижнего уровня зависит от того, какой область применения была создана функция, и под каким областью он приспособлен, прицел является нижним уровнем). В настоящее время верхним уровнем функции является глобальная область. В глобальном объеме, a = 1, поэтому в настоящее время, третья строка: 1, а затем четвертая строка, a = 2 присваивает значение, все еще нет A в области функции, поэтому найдите A в прицеле верхнего уровня, то есть глобальная область и модифицируйте в глобальной области, так что A = 2 сделает в глобальной областях = 2, а 2, а также ультраляция 2;
Этот момент должен быть четко понят и обратите внимание на разницу между VAR или нет.
Следующий:
var a = 1; функция fn1 (a) {alert (a); // неопределенное a = 2; } fn1 (); предупреждение (а); // 1Разница между этим примером и предыдущим заключается в том, что есть дополнительный параметр. Функция параметра эквивалентна локальной переменной, то есть будет var a = неопределенное в предварительной обработке в функции. Следовательно, предупреждение третьей строки: неопределенная, и четвертая строка A = 2 изменяет A в области функции, что не влияет на A в глобальном контексте. Оповещение седьмой строки: 1;
затем:
var a = 1; function fn1 (a) {alert (a); // 1a = 2;} fn1 (a); alert (a); // 1Этот пример несколько отличается от предыдущего. Когда функция вызывается в шестой строке, параметр передается. Фактический параметр a функции шестой строки - 1 из глобальной переменной a = 1. Когда функция выполняется, вторая строка A = 1, поэтому третья строка совещание: 1 и предупреждение седьмой строки: 1.
Обратите внимание на разницу между этими примерами и не путайте их.
Еще один:
var a = 1; function en () {var a = 2; fn ();} function fn () {alert (a); // 1} en ();В FN не объявлено, и вам нужно взять значение в сфере применения, где создается функция - она «создана», а не «вызовать» область функции.
PS: Cope и Context Concepts в JavaScript
Прицелы и контексты в JavaScript уникальны для этого языка, отчасти благодаря гибкости, которую они приносят. Каждая функция имеет различную переменную контекст и объем. Эти концепции подкреплены некоторыми мощными шаблонами дизайна в JavaScript. Тем не менее, это также приводит к большой путанице для разработчиков. Следующее полностью раскрывает различия в контексте и масштабе в JavaScript и о том, как их используют различные шаблоны дизайна.
Контекст против масштаба
Первый вопрос, который нужно разъяснить, заключается в том, что контекст и объем являются разными понятиями. За эти годы я заметил, что многие разработчики часто путают эти два термина, неправильно описывая один как другой. Чтобы быть справедливым, эти термины стали очень запутанными.
Каждый вызов функции имеет область и контекст, связанный с ним. По сути, область охвата основана на функциях, а контекст основан на объекте. Другими словами, область применения связана с доступом переменных каждый раз, когда вызывается функция, и каждый вызов независим. Контекст всегда является значением ключевого слова это, ссылка на объект, который вызывает текущий исполняемый код.
Выше приведено сфера JavaScript, введенный вам редактором (рекомендуется). Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!