在JavaScript中创建闭包时

在JavaScript中创建闭包时,javascript,closures,Javascript,Closures,我想知道在JavaScript中创建闭包时 函数outerFunc(){ var a=2; 函数(){ 控制台日志(a); 控制台日志(b); }; var b=4; } var saveFunc=outerFunc(); saveFunc(); 是在执行代码之前创建闭包,还是在调用outerFunc时创建闭包,或者在编写innerFunc时创建闭包,或者是在innerFunc从outerFunc返回并将innerFunc与闭包一起存储在saveFunc中时创建闭包?这样想:“闭包是一件事。”

我想知道在JavaScript中创建闭包时

函数outerFunc(){
var a=2;
函数(){
控制台日志(a);
控制台日志(b);
};
var b=4;
}
var saveFunc=outerFunc();
saveFunc();
是在执行代码之前创建闭包,还是在调用outerFunc时创建闭包,或者在编写innerFunc时创建闭包,或者是在innerFunc从outerFunc返回并将innerFunc与闭包一起存储在saveFunc中时创建闭包?

这样想:“闭包是一件事。”具体来说,它是一个
函数()
已在另一个函数体中声明。您可以传递对该函数的引用以允许调用该函数,当您这样做时,它仍然可以神奇地访问它可用的变量(例如示例中的
a,b
)。这就是闭包的魔力。

在outerFunc()创建时。 每次创建函数时都会创建闭包

请访问此链接:

闭包是在函数定义时创建的。因此,如果您有:

var a = 1;
function foo() {
  console.log(a);
}
这是一个结束。它“关闭”外部变量。在这种情况下,
a
。老实说,“关闭”对我来说从来没有意义(可能是从另一个角度),所以我更喜欢这样想——一个可以访问外部范围的函数。在这种情况下,
a
来自外部范围

这似乎有点奇怪,因为很多闭包的示例和解释都有如下内容:

函数外部(){
var a=1;

调用
outerFunc()时返回函数inner(b){//
@Thomas我是这么想的,但有一个论点是,这个术语实际上是指函数中代码可见的所有声明符号的集合。也就是说,它更多地是一个静态的东西,而不是为函数的实际调用分配的内存。闭包是一个函数,它引用了我创建的环境根据这个定义,每个函数在JavaScript中都是一个闭包(实现可能会优化,但这与讨论无关)。因此,在对函数定义求值时会创建一个闭包。在调用
outerFunc
之前,不会对内部函数定义求值。@FelixKling是正确的。每个函数都是一个闭包,并且是定义创建了一个闭包。不过,更非正式地说,我们通常在函数实际重新定义时谈论闭包引用外部的东西,所以虽然
f=a=>a+1
是一个闭包,但我们倾向于不将其作为闭包来引用,并保留类似
b=1;f=a=>a+b
的术语,在这一点上值得注意的是,可能有些语言具有定义闭包的特殊语法。例如,在PHP中(直到最近?),您必须编写
function()使用($outerVariable){}
“它是一个在另一个函数体中声明的函数()”,不仅仅是,至少不是在JavaScript上下文中。全局函数也是闭包。全局变量工作是因为函数是闭包。