闭包循环问题-for循环只显示最后一个i的值

如下,正常应该输出是的1,但是下面的输出结果是5

原因(参照js中的预解释篇)

首先会对变量进行预解释,带有var和function的变量(等号左边的,因为右边属于定义值)

上面在预解释中声明了a和i,然后循环中对a[i]进行定义,但是未执行即

a[0] = function(){                     a[1] = function(){

return i;                                   return i;

}                                               }                                             ...

当循环结束时调用a[1]()此时要返回i,这时会在同级中寻找i,未找到则追溯到上一级,这时上一级的i已经被加加成4,则无论是数组中的哪个值返回的都会是5

在解决这个问题时常常会使用立即执行函数的方式

因为立即执行函数在4-8行时声明、定义、执行一起完成了,所以找到的i就是当前的值

相关文档

http://www.cnblogs.com/ZinCode/p/5551907.html

https://www.zhihu.com/question/33468703

时间: 2024-12-24 13:29:10

闭包循环问题-for循环只显示最后一个i的值的相关文章

ajax循环调用时,只返回最后一次的值,后台执行最后一次数据

1. 代码:var i;for(i=0;i<10;i++){      ajaxServise(i);} 在for循环中调用ajax方法  补充页面上的数据,这样写是错误的,他不会每执行一次for循环就执行一次ajax方法,而是等for循环结束才去执行ajax方法,所以导致ajax只被执行一次.然而当修改如下: for(i=0;i<10;i++){      alert("aa");      ajaxServise(i);}与上面不同的是在每次调用的时候都弹出一个窗体 

recyclerview23+出现多个item只显示第一个item的问题

1.改成21+可以,如果不行,就使用第2或第3个解决方案 2.对每个item的inflate,传入两个参数,第二个参数设置为null,而不是使用3个参数(第二个parent,第三个false) 3.item的根部局高度不要设置为相对的(match_parent或wrap_content),要设置为具体的高度就ok了 4.23+可能不是不加载,只是每个item都占满了一屏,往后拉可以看到下一个item

(转)深入理解JavaScript的闭包特性 如何给循环中的对象添加事件

深入理解JavaScript的闭包特性如何给循环中的对象添加事件 初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript的闭包特性. 有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. 1.  <!DOCTYPE HTML> 2.  <html> 3.  <head&g

深入理解JavaScript的闭包特性如何给循环中的对象添加事件

初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript的闭包特性. 有个网友问了个问题,如下的html,为什么点击所有的段落p输出都是5,而不是alert出对应的0,1,2,3,4. 1.  <!DOCTYPE HTML> 2.  <html> 3.  <head> 4.  <meta charset="utf

闭包函数如何使用循环变量

一般情况下,闭包的函数体内是避免使用循环变量的,因为调用主体函数时, 循环变量一般是执行结束后,返回一个执行后的值. def count(): fs = [] for i in range(1, 4): def f(): return i*i fs.append(f) return fs f1, f2, f3 = count() print(f1(),f2(),f3()) 预期返回的结果是1,4,9,但实际返回的结果是9,9,9 原因就是当count()函数返回了3个函数时,这3个函数所引用的变

LODOP循环多任务 同模版只设置不同队列任务名

LODOP中从PRINT_INIT(或PRINT_INITA)到最后PRINT(或PREVIEW等),是一个任务,关于Lodop中一个任务,以及一个任务中可以包含哪些语句,详细可查看本博客另一篇博文:Lodop打印语句最基本结构介绍(什么是一个任务) 一个任务中,可以有多页,可以是自动分页或手动分页得来的,例如:Lodop打印控件 超文本自动分页,Lodop强制分页LODOP.NewPage()和LODOP.NewPageA() 如果一个任务中页数过多,会因为一次性占用太多的系统资源而需要等待很

JS中的循环结构、循环嵌套以及函数介绍

[循环结构的步骤]    *①声明循环变量    *②判断循环条件    *③执行循环体(while的{}中的所有代码)操作     *④更新循环变量    *     * 然后,循环执行②③④    *     *     * [JS中循环条件支持的数据类型]    * ①boolean:true 真     false   假    * ②string: 非空字符串为真       空字符串为假    * ③null/NaN/undefined:  全为假    * ④object:全为真 

if语句,for循环,while循环

pycharm必须用英文半角  注意空格使用   if 循环语句:  if sequence:                                                                          if 1>2(True包括:表示非零数的所有值)   False:表示0,None,空的量等                   print                                                           

Oracle-34-if语句、case语句、loop循环、while循环、for循环

一.IF语句 在PL/SQL中,if, then, else, elsif, endif等关键字用来执行条件逻辑 语法格式: if  条件1 then       语句1 elsif  条件2 then       语句2 else       语句3 end if; 例1:练习if结构 解:注意下图中的程序: 二.case语句 语法结构: case 变量 when 值1 then 语句1; when 值2 then 语句2; when 值3 then 语句3; -- when 值n then