根据我的理解,变量“ a”是全局变量。但是,当我在Chrome控制台中检查此内容时,发现变量'a'为闭包。为什么?
var a = 5;
function abc()
{
var b = 4;
return a*b;
}
console.dir(abc);
答案 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”未在内部定义,因此它将在函数外部查看作用域,直到找到它为止。
这是一个关闭。