Глобальный или Закрытие? - PullRequest
0 голосов
/ 20 декабря 2018

Console Image

Согласно моему пониманию, переменная «a» является глобальной.Но когда я проверяю это в консоли Chrome, я нахожу переменную 'a' в качестве замыкания.Почему?

var a = 5;
function abc()
{
 var b = 4;
 return a*b;
}
console.dir(abc);

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Да, это отображается в Chrome, но не в Mozilla.

Сначала вам нужно понять лексическую область видимости в JavaScript.Это означает, что внутренние функции имеют доступ к переменным и другим ресурсам своей родительской области.Здесь родительская область действия является глобальной областью действия.

Так функция добавляет переменную, определенную вне функции, внутри нее с помощью замыкания.Чтобы выполнить функцию, она будет искать нужные ей переменные.Переменная 'a' не определена внутри, поэтому она будет смотреть на область за пределами функции, пока не найдет ее.

Это закрытие.

0 голосов
/ 20 декабря 2018

tl; dr: Каждая функция технически является закрытием в JavaScript.

Глобальная среда ничего особенного в этом отношении (она особенная в других отношениях).Это просто первая среда, которая создается и как таковая находится в конце каждой «цепочки среды».Т.е. каждая среда, созданная во время выполнения программы, создается «внутри» глобальной / первой / верхней среды и, таким образом, доступна для всех.

См. Ниже дополнительную информацию о том, как связаны среды и функции.


Что такое замыкание?

Закрытие - это функция, которая может получить доступ и разрешить свободные переменные .Это переменные, которые не являются параметрами функции и не определены в самой функции.
a является свободной переменной в вашем примере.

Как функции разрешают свободные переменные в JavaScript?

Вы можете представить себе среду / область видимости как таблицу или объект, который связывает значение с меткой.Например, среда, содержащая

var a = 42;

, может выглядеть как

+--------+
| a | 42 |
+--------+

Теперь, когда вы определяете функцию, она получает ссылку на среду (т.е. эта метка-> ассоциация значения), в которой она была создана. Среда, содержащая

var a = 42;
function foo(bar) {
  console.log(a);
}

, будет выглядеть как

+--------+                               
|a   | 42|         +----------------+    
|foo |  -+---------> FunctionObject |    
+--------+         +----------------+    
     ^             |name    | "foo" |    
     |             |[[env]] |    ---+ -+
     |             +----------------+  |
     |                                 |
     +---------------------------------+

Теперь, когда foo равно , выполните создается новая среда, в которой родительская среда является средой, в которой была создана функция. Т.е. когда происходит foo(21), наше состояние:

+-----------------+                      
|bar        | 21  |                      
|[[parent]] |  ---+--+                   
+-----------------+  |                   
                     |                   
     +---------------+                   
     |                                  
     v                                  
+--------+                               
|a   | 42|         +----------------+    
|foo |  -+---------> FunctionObject |    
+--------+         +----------------+    
     ^             |name    | "foo" |    
     |             |[[env]] |    ---+--+
     |             +----------------+  |
     |                                 |
     +---------------------------------+

Теперь, когда мы пытаемсяaccess a, он не найден в текущей среде, поэтому мы смотрим на его родителя, где он определен.

Опять же, глобальная среда 1053 * ничего особенного в этом отношении не представляет.Это просто среда first , которая создается, поэтому каждая функция имеет ссылку на нее (прямо или косвенно в случае вложенных функций).Вот что делает его «глобальным».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...