循环在闭包里的问题(写的不一定正确纯属阐述个人理解)

 1 function box(){
 2    var arr=[];
 3    for(var i=0;i<5;i++){
 4    arr[i]=function(){
 5       return i;
 6       }
 7    }
 8     return arr;
 9 }
10 var cat=box();
11 for(var i=0;i<5;i++){
12 alert(cat[i]());
13 }

看上面一段代码,总体看来alert(cat[i]());会分别输出0,1,2,3,4;其实不然,输出的全是5;

这时我们会产生疑问,为什么输出是5?没道理啊?让我们看下面的小代码:

var box=function(){
  return "你好";
}
alert(box);//这里的谁输出代码表达式,类型function
alert(box());//这里会是输出结果:你好,类型function

上面所写,牵扯到运行与不运行的问题。

alert(box);只是简单传递表达式,

alert(box());则是运行代码

再看下一段代码

 1 function box(){
 2    var arr=[];
 3    for(var i=0;i<5;i++){
 4    arr[i]=function(){
 5       return i;
 6       }
 7    }
 8     return arr;
 9 }
10 var cat=box();
11 for(var i=0;i<5;i++){
12 alert(cat[i]());
13 }

第4行代码正是只传递了代码代码段,所以当循环执行完毕,每一个i保存了这样一段代码

function(){  return i; }

而i的值 就是循环后的i=(4++=5);

所以每一个i的值就为5;

但是我们怎样改进呢?让我们看这样一段代码

1 var box=(function(){
2 return "你好";
3 })();
4 alert(box);//输出:你好

我们知道上面这样一种写法会自动运行代码,所以不会输出代码代码段。所以我们可以这样写

 1         function box(){
 2                 var arr=[];
 3                 for(var i=0;i<5;i++){
 4                 arr[i]=(function(){
 5                 return i;
 6              })();
 7         }
 8             return arr;
 9         }
10                 var cat=box();
11                 for(var i=0;i<5;i++){
12                 alert(cat[i]);
13         }

输出0,1,2,3,4//正确了!

以上所写纯属个人意见,如有错误,请给与改正!谢谢。

时间: 2024-10-11 06:56:03

循环在闭包里的问题(写的不一定正确纯属阐述个人理解)的相关文章

跳出多层循环:三层循环,最里层直接跳出3层

跳出多层循环:三层循环,最里层直接跳出3层 方法一: 在Python中,函数运行到return这一句就会停止,因此可以利用这一特性,将功能写成函数,终止多重循环 1 2 3 4 5 6 7 8 9 10 11 12 13 14 def work():                                  #定义函数     for i in range(5):         print("i=", i)         for j in range(5):        

js settimeout定时 for循环问题 闭包

js settimeout定时 for循环问题 闭包先做个笔记 留待研究 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script type="text/javascript" src="jquery.1.7.2.min.js&q

深入理解闭包系列第四篇——常见的一个循环和闭包的错误详解

前面的话 关于常见的一个循环和闭包的错误,很多资料对此都有文字解释,但还是难以理解.本文将以执行环境图示的方式来对此进行更直观的解释,以及对此类需求进行推衍,得到更合适的解决办法 犯错 function foo(){ var arr = []; for(var i = 0; i < 2; i++){ arr[i] = function(){ return i; } } return arr; } var bar = foo(); console.log(bar[0]());//2 以上代码的运行

JS里写入(混写)php&nbsp;asp

原文:JS里写入(混写)php asp JS里写入(混写)php 方法1:<Br> <script language="javascript"> document.write("<?php echo "阳光谢谢你"?>"); </script> <Br> <Br> 方法2<Br> <script language="javascript"

循环删除集合里的值

1: List<string>.Enumerator enumerator = files.GetEnumerator(); 2: while (enumerator.MoveNext()) 3: { 4: if (File.Exists(enumerator.Current)) 5: { 6: File.Delete(enumerator.Current); 7: } 8: } .csharpcode, .csharpcode pre { font-size: small; color: b

《vue里用vux写移动端搭建环境》

vue里用vux写移动端搭建环境 一,序言 最近一直在看vue,越看越觉得有意思,由于工作需要,了解了一下vux,发现是个强大好用的UI组件库,以前用过vant,iview,其它的组件库目前还没发现,也还没用过,如果各位有好用的大方分享出来喔 ~    一起学习,一起进步!下面进入正题,vux的配置环境. 二,vux安装环境 1.安装vux npm install vux --save-dev ( 如果是3.0+的脚手架,那么可以直接在终端输入vue ui打开ui界面去安装依赖会更加方便!) 2

python 文件单行循环读取的坑(一个程序中,文件默认只能按行循环读取一次,即使写到另一个循环里,它也只读取一次)

本来写了一个程序,想获取a文件中有,但是b文件中没有的行: 想到的方法是:1.一行一行提取a文件中数据,然后用a文件中的每一行与b文件中的每一行比较, 2.如果找到相同行就继续查找a中的下一行,如果找不到,就把这行保存起来,就是要找的一行 程序写成如下: f = open("file/a.txt","r",newline='\n') ff= open ("file/aa.txt","r",newline='\n') new=o

一个循环和闭包的例子

1 for (var i=1; i<=5; i++) { 2 setTimeout(function timer() { 3 console.log(i); 4 }, i*1000); 5 } 预期:分别输出数字 1-5,每秒一次,每次一个. 实际上,会每秒一次输出 5次6,. 知识点: JS引擎是单线程的,定时器的工作方式:按指定时间间隔,将定时器的代码添加到JS引擎的消息队列:而非到了指定的时间立即执行回调函数. 在上例中, 作用域 尽管循环中的五个函数在各个迭代中分别定义,但都被封闭在一个

用for循环将数组里的元素排序

#include<stdio.h>int  main() //定义数组的容量# define SIZE 6{ unsigned int i,j,temp;//定义要用的相关变量int a[SIZE]={12,45,14,96,56,23};printf("冒泡排序前:");for(i=0;i<SIZE;i++)//for循环输出排序前数组里的元素{printf("%d",a[i]); } //计算机内部进行排序操作 for(i=0;i<SIZ