涉及外部变量时的JavaScript和闭包
我一直在读一本关于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(
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)代码>