Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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_Browser - Fatal编程技术网

循环内部的Javascript闭包

循环内部的Javascript闭包,javascript,browser,Javascript,Browser,我正在学习JavaScript。虽然我完全理解JavaScript只具有函数作用域而不具有块作用域,但我偶然发现了一个for循环的示例,在该示例中函数是完全创建的,我完全忽略了为什么下面的示例不能像预期的那样工作 var funcs=[]; 对于(var i=0;i

我正在学习JavaScript。虽然我完全理解JavaScript只具有函数作用域而不具有块作用域,但我偶然发现了一个for循环的示例,在该示例中函数是完全创建的,我完全忽略了为什么下面的示例不能像预期的那样工作

var funcs=[];
对于(var i=0;i<3;i++){//让我们创建3个函数
funcs[i]=function(){//并将它们存储在funcs中
log(“我的值:+i);//每个都应该记录其值。
};
}
对于(var j=0;j<3;j++){
funcs[j]();//现在让我们运行每个
}
func[0]、func[1]和func[2],而函数声明将始终返回2

否。
func[i]
总是返回
3
,因为当函数运行时
i
3

在我看来,for循环中创建了某种作用域

没有(当然有,但是
let
不起作用,所以它不用于任何用途)。范围由封闭函数定义
i
存在于该范围内,并由for循环更改


for循环的逐步评估是什么样子的?为什么

创建一个数组

for (var i = 0; i < 3; i++) {      // let's create 3 functions
i
当前所在的位置为数组分配函数

}
循环结束

for (var j = 0; j < 3; j++) {
调用第一个函数<代码>i是
3
。 调用第二个函数<代码>i是
3
。 调用第三个函数<代码>i是
3

}

Fin.

函数中
i
的值引用了
i
外部的值,该值不断变化。因此,当您最终全部
func[x]
时,
i
的值是3(这打破了
i<3
处的
for
循环),也请注意,在ES2015中,通过
let
const
声明,JavaScript确实具有块作用域。虽然我完全理解JavaScript只具有函数作用域而不具有块作用域,但您完全理解错误。@torazaburo:我是编程新手,如果我弄错了,很抱歉。请你详细说明一下,或者提供一个链接来帮助解释,好吗?@RocketHazmat:这也有点让人困惑,因为这意味着JavaScript在这里通过引用传递i作为调用,对吗?我认为除了数组和对象之外,JavaScript在所有情况下都是按值调用的?但这也有点让人困惑,因为这意味着JavaScript在这里将I作为引用调用传递,对吗?我以为JavaScript在所有情况下都是按值调用的,但数组和对象除外?@Sebastian-它不传递任何变量。调用函数时,代码根本不会传递任何参数。
for (var j = 0; j < 3; j++) {
  funcs[j]();                      // and now let's run each one to see
}