Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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_Variables_Reference_Closures - Fatal编程技术网

涉及外部变量时的JavaScript和闭包

涉及外部变量时的JavaScript和闭包,javascript,variables,reference,closures,Javascript,Variables,Reference,Closures,我一直在读一本关于JavaScript的书,作者在几页的时间里一直在讨论闭包的问题。在一页中,他展示了以下示例: function wrapElements(a) { var result = [], i, n; for (i = 0, n = a.length; i < n; i++) { result[i] = function() { return a[i]; }; } return result; } var wrapped = wrapElements(

我一直在读一本关于JavaScript的书,作者在几页的时间里一直在讨论闭包的问题。在一页中,他展示了以下示例:

function wrapElements(a) {
  var result = [], i, n;
  for (i = 0, n = a.length; i < n; i++) {
    result[i] = function() { return a[i]; };
  }
  return result;
}

var wrapped = wrapElements([10, 20, 30, 40, 50]);
var f = wrapped[0];
函数包装(a){
var结果=[],i,n;
对于(i=0,n=a.length;i
现在,他说人们可能期望f()返回10,但实际上返回未定义

他是这么说的:

程序中的错误源于程序员 显然期望函数在当时存储i的值 已创建嵌套函数。但事实上,它包含一个引用 对我来说。由于i的值在创建每个函数后都会发生变化,因此 内部函数最终会看到i的最终值。[…]自 循环的迭代增加i,直到循环结束 数组,当我们实际调用其中一个闭包时,它会查找 索引数组的5并返回未定义的值。

但我就是无法理解他的解释。我再次阅读了他之前关于闭包的解释(我想我理解他们——但显然,我似乎不理解),我在互联网上搜索了更多关于闭包的信息。我仍然不明白为什么f()将返回未定义

匿名函数不会在循环的每次迭代中被创建和调用吗;因此,它不会查找所有索引,而不仅仅是索引5吗?还是我误解了什么


有人能帮我吗?谢谢。

在循环中创建的所有小函数都共享该公共变量
i
。当
for
循环完成时,
i
的值是多少<代码>5

调用函数时,
i
仍然是
5
,而
a[5]
未定义的

下面是创建函数的循环:

  for (i = 0, n = a.length; i < n; i++) {
    result[i] = function() { return a[i]; };
  }
for(i=0,n=a.length;i

创建的每个函数都包含对
i
的引用,表示“返回与
i
的当前值相对应的数组元素”,其中current表示实际调用函数时的当前值。JavaScript并没有为这些函数保留一些“冻结”状态,它保留了封闭函数的实际作用域。在该范围内,变量
i
仍然是它原来的jolly self,只要在循环中创建的任何函数询问它的值,它就会是
5

no-该函数没有在循环中调用。如果循环中的函数是IIFE,它就会工作,因为函数在每次迭代时都会在循环范围内调用,例如,
result[i]=(函数(索引){返回一个[index];})(i)