全局还是关闭?

时间:2018-12-20 05:27:51

标签: javascript closures

Console Image

根据我的理解,变量“ a”是全局变量。但是,当我在Chrome控制台中检查此内容时,发现变量'a'为闭包。为什么?

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

2 个答案:

答案 0 :(得分:3)

tl; dr:从技术上讲,每个函数都是JavaScript中的闭包。

全局环境在这方面没什么特别的(在其他方面也很特别)。它仅仅是创建的第一个环境,因此位于每个“环境链”的尽头。即在程序运行时创建的每个环境都是在全局/第一个/顶级环境内部创建的,因此所有人均可使用。

有关环境和功能之间如何关联的更多信息,请参见下文。


什么是闭包?

闭包是可以访问和解析免费变量的函数。这些不是函数参数且未在函数本身中定义的变量。
a是您的示例中的自由变量。

函数如何解析JavaScript中的自由变量?

您可以将环境/范围想象为将值与标签关联的表或对象。例如,包含

的环境
var a = 42;

可能看起来像

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

现在,当您定义一个函数时,它会获得对其创建所在环境(即此label-> value关联)的引用。该环境包含

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]] |    ---+--+
     |             +----------------+  |
     |                                 |
     +---------------------------------+

现在,当我们尝试访问a时,在当前环境中找不到它,因此我们来看一下它的父级(定义位置)。

同样,全球环境在这方面没什么特别的。它只是创建的 first 环境,因此每个函数都有对其的引用(在嵌套函数的情况下直接或间接)。这就是使它成为“全局”的原因。

答案 1 :(得分:0)

是的,它显示在Chrome中,而不显示在Mozilla中。

首先,您需要了解JavaScript中的词法作用域。这意味着内部函数可以访问其父作用域的变量和其他资源。这里的父范围是全局范围。

这是函数使用闭包在函数外部添加定义的变量的方式。为了执行该功能,它将查找所需的变量。变量“ a”未在内部定义,因此它将在函数外部查看作用域,直到找到它为止。

这是一个关闭。