Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript—函数表达式和声明中局部变量的范围_Javascript_Scope_Local Variables - Fatal编程技术网

javascript—函数表达式和声明中局部变量的范围

javascript—函数表达式和声明中局部变量的范围,javascript,scope,local-variables,Javascript,Scope,Local Variables,在阅读了SO和this之后,我仍然不太理解局部变量的范围。我还读了本·阿尔曼的这篇好文章 函数foo(){ var i=0; console.log(++i); } foo()//1. foo()//1. //################## var foo=函数(){ var i=0; console.log(++i); }; var x=foo; x()//1. x()//1. //################## 函数foo2(){ var i=0; 返回函数(){ consol

在阅读了SO和this之后,我仍然不太理解局部变量的范围。我还读了本·阿尔曼的这篇好文章

函数foo(){
var i=0;
console.log(++i);
}
foo()//1.
foo()//1.
//##################
var foo=函数(){
var i=0;
console.log(++i);
};
var x=foo;
x()//1.
x()//1.
//##################
函数foo2(){
var i=0;
返回函数(){
console.log(++i);
};
}
var x=foo2();
x()//1.

x()//2--我不理解这个
,因为您多次调用由主函数返回的内部函数,而主函数(foo2)只执行一次。因此,没有重置发生,我不断增加

因此
foo2()
调用一次,内部函数调用两次

var x = foo2();
当您这样做时,我将被初始化为
0
,并返回一个函数。请注意,您不再使用此函数,只使用返回的函数

   x();
执行返回函数的那一行和执行该行的那一行

console.log(++i);

x(); 

同样如此。

这是因为您多次调用内部函数,该函数由主函数返回,而主函数(foo2)只执行一次。因此,没有重置发生,我不断增加

因此
foo2()
调用一次,内部函数调用两次

var x = foo2();
当您这样做时,我将被初始化为
0
,并返回一个函数。请注意,您不再使用此函数,只使用返回的函数

   x();
执行返回函数的那一行和执行该行的那一行

console.log(++i);

x(); 


同样如此。

第三个示例表现为一个类,其中var i=0;是私有变量。每次执行x()时,它都会触发返回函数并增加该私有值的值。为了每次都得到结果0,应该调用foo2()()。如您所见。您从
foo2()
返回了一个匿名函数,该函数中有一个
i
,正在引用该函数。所以每次你调用匿名函数。您正在递增
foo2()
@AleksandarGajic中的值:不,不是一个“类”。只是调用
foo2
的上下文上的一个闭包。“我仍然不知道局部变量是如何行为的,无论是函数声明还是函数表达式”wrt您的示例代码它们的行为是相同的。@Yury完全正确-如果在命名或匿名函数中使用作用域变量,这不是作用域变量行为不同的问题,这似乎是错误闭包的一个实例。第三个示例的行为类似于一个类,其中var i=0;是私有变量。每次执行x()时,它都会触发返回函数并增加该私有值的值。为了每次都得到结果0,应该调用foo2()()。如您所见。您从
foo2()
返回了一个匿名函数,该函数中有一个
i
,正在引用该函数。所以每次你调用匿名函数。您正在递增
foo2()
@AleksandarGajic中的值:不,不是一个“类”。只是调用
foo2
的上下文上的一个闭包。“我仍然不知道局部变量是如何行为的,无论是函数声明还是函数表达式”wrt您的示例代码它们的行为是相同的。@Yury完全正确-如果在命名或匿名函数中使用作用域变量,这不是作用域变量行为不同的问题,这似乎是误解闭包的一个实例。“这是因为您多次调用内部函数,而主函数只执行一次”。这是为什么呢?@Aónio我会更新它的更多描述。@Aónio因为您在第三个示例(
var x=foo2()
)中将foo2作为函数调用,所以x被设置为foo2的返回值,而不是您的第二个示例,其中x实际上根据代码是对foo函数的引用(
var x=foo
),不会发生重置。只需重新实例化函数,我们不需要对闭包进行另一种超简短的解释。我们在中已经有了深入的解释,“这是因为您多次调用内部函数,而主函数只执行了一次”。这是为什么呢?@Aónio我会更新它的更多描述。@Aónio因为您在第三个示例(
var x=foo2()
)中将foo2作为函数调用,所以x被设置为foo2的返回值,而不是您的第二个示例,其中x实际上根据代码是对foo函数的引用(
var x=foo
),不会发生重置。只需重新实例化函数,我们不需要对闭包进行另一种超简短的解释。我们在这方面已经有了深入的解释。