js中闭包for循环

var a=[];
for(var i=0;i<10;i++){
    a[i]=function(){
        alert(i);
    }
}
alert(i);    //10
a[0]();        //10
a[9]();        //10

  为什么a[0]到a[9]都是10,而不是我们想像中的0到9呢?

  我的理解是js的作用域导致的.

  首先来看参数的传递.js是按值传递的,源代码中的a[i]=function(){alert(i)},a[i]保存的是一个指向堆内存的地址(对象和方法在js中保存在堆内存中).当每一次for循环时:a[0]=function(){...},a[1]=function(){...},一直到a[9]=function(){...},循环改变的是a[0]到a[9],a[i]里的function(){...}毫无变化,仍然是一个指向堆内存的字符串.那么又引出一个新问题,为什么不增加function(){...}里面的i,因为匿名函数不能自我执行.当最后调用a[0]到a[9]时,保存着匿名函数地址的字符串才真正去在堆内存中找方法执行,这时for循环早已结束,结果都是10.

  将代码改成a[i]=i;a[i]保存的是一个基本类型值,可以得到a[0]=0 ...... a[9]=9.因为没有作用域链的限制.

var b=[];
for(var j=0;j<10;j++){
    b[j]=function(){
        return j;
    }()
}

alert(j);           //10
alert(b[0]);        //0
alert(b[9]);        //9

  将匿名函数自动执行,并且赋值给b,达到我们想要的结果

时间: 2024-10-20 19:22:07

js中闭包for循环的相关文章

关于js中闭包的理解

1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; } } var fn = foo(); 上面的代码只能访问 a和b,但是不能修改,这是js中闭包的技术之一 function foo() { var a = 123; var b = 456; return { get_a: function () { return a; }, set_a: fu

php中的for循环和js中的for循环

php中的for循环 循环100个0 for ($i=0;$i<=100;$i++){ $pnums.='0'.","; } js中的for循环,循环31个相同的数.循环日期时间 var list=[]; for(var i= 0;i < 31;i++){ list.push(620); }//日期时间 var list = []; for (var i = 1; i <= 31; i++) { list.push('2017.01.' + i); }

js中的for循环

1 js中的for循环,实心菱形,空心菱形,九九乘法表,等腰三角形 /* * 2 * * 3 * * * 4 * * 5 * 6 */ 7 8 //实心菱形 9 10 var count=3; 11 for (var i=1;i<=count ;i++ ) 12 { 13 for (var k=3;k>=i ;k-- ) 14 { 15 document.write(" "); 16 } 17 for (var j=1;j<=i ;j++) 18 { 19 docum

js事件、Js中的for循环和事件的关系、this

一.js事件  1.事件 用户在网页中所触发的行为 鼠标滑动种类很多,键盘.表单特列: 点击:onclick 鼠标进入:onmouseenter 鼠标离开:onmouseleave 鼠标悬浮:onmouseover  鼠标移除:onmouseout 鼠标按下:onmousedown 鼠标抬起:onmouseup 鼠标移动:onmousemove 表单聚焦:onfocus 表单失去焦点:onblur 浏览器加载完成:onload js事件是一直存在的,可以绑定方法,也可以不绑定,如果没有绑定,事件

JS 中闭包的变量 闭包与this

闭包与变量: 作用域链的一个副作用,闭包只能取得包含函数中任何变量的最后一个值.别忘了闭包所保存的是整个变量对象,而不是某个特殊的变量. function fn1(){ //创建一个数组 var arr = new Array(); //为数组赋值,此时i是保存在fn1 这个作用域中 for (var i = 0; i <10; i++) { arr[i] = function(){ return i } } return arr; } var fs = fn1(); for (var i =

swift中闭包的循环引用

首先我们先创造一个循环引用 var nameB:(()->())? override func viewDidLoad() { super.viewDidLoad() let bu = UIButton(type: .ContactAdd) bu.addTarget(self, action: "tap", forControlEvents: .TouchUpInside) view.addSubview(bu) run { print("name") sel

js中闭包和对象相关知识点

学习js时候,读到几篇不错的博客.http://www.cnblogs.com/yexiaochai/p/3802681.html一,作用域 和C.C++.Java 等常见语言不同,JavaScript 的作用域不是以花括号包围的块级作用域(block scope),这个特性经常被大多数人忽视,因而导致莫名其妙的错误.例如下面代码,在大多数类C 的语言中会出现变量未定义的错误,而在JavaScript 中却完全合法: if(true) { var somevar = 'value'; } con

对js中闭包,作用域,原型的理解

前几天,和朋友聊天,聊到一些js的基础的时候,有一种‘好像知道,好像又不不知道怎么讲的感觉’...于是捡起书,自己理一理,欢迎拍砖. 闭包 理解闭包首先要理解,js垃圾回收机制,也就是当一个函数被执行完后,其作用域会被收回,如果形成了闭包,执行完后其作用域就不会被收回. 如果某个函数被他的父函数之外的一个变量引用,就会形成闭包 闭包的作用,就是保存自己私有的变量,通过提供的接口(方法)给外部使用,但外部不能直接访问该变量. 例子(使用闭包): var test=(function(){ var

JS中闭包的介绍

闭包的概念 闭包就是能够读取其他函数内部变量的函数. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(