`
Matrixes
  • 浏览: 663 次
  • 性别: Icon_minigender_1
  • 来自: 襄樊
最近访客 更多访客>>
社区版块
存档分类

当心下面例子的循环:闭包中的局部变量可能和你最初想的不一样。

阅读更多

如题,这是为什么?

<script>
function buildList(list) {   
  var result = [];   
  for (var i = 0; i < list.length; i++) {   
    var item = 'item' + list[i];   
    result.push( function() {document.write(item + ' ' + list[i] + '<br />')} );   
  }   
  return result;   
}   

function testList() {   
  var fnlist = buildList([1,2,3]);   
  // using j only to help prevent confusion - could use i   
  for (var j = 0; j < fnlist.length; j++) {   
    fnlist[j]();   
  }   
}     

testList();  //输出3次:'item3 undefined' 
document.write('<br />');
</script>

 

分享到:
评论
1 楼 Matrixes 2012-08-07  
<script>
function buildList(list) { 

  var result = [];   

  for (var k = 0; k < list.length; k++) {    

	result.push(

		function(i){	

			var item = 'item' + list[i];	
			
			return function(){

				document.write(item + ' ' + list[i] + '<br />');

			}

		}(k)

	);  

  } 
  
  return result;   

}   

function testList() {   

  var fnlist = buildList([1,2,3]);   

  // using j only to help prevent confusion - could use i   
  for (var j = 0; j < fnlist.length; j++) {   

    fnlist[j]();   

  } 
  
}     

testList(); 
</script>

相关推荐

    Web-前端教程36 JS进阶:闭包.zip

    1. **作用域**:在JS中,有全局作用域和局部作用域。全局变量在整个程序中都可访问,而局部变量只在其定义的函数内有效。当函数内部定义了一个函数,那个内部函数就有了自己的作用域,但同时也可以访问到外部函数的...

    跨越边界:闭包

    闭包是一种强大的编程概念,它允许函数访问和操作其外部作用域中的变量,即使在函数执行完毕后仍然能够保持对这些变量的访问。这个特性使得闭包成为函数式编程和面向对象编程中的重要工具,尤其是在诸如Lisp、...

    python中闭包共4页.pdf.zip

    Python中的闭包是一种重要的编程概念,它涉及到函数、作用域和引用等核心概念。闭包在Python编程中扮演着至关重要的角色,特别是在处理高阶函数、数据封装和异步编程等场景。以下是对闭包的详细解释: 1. **闭包的...

    [深入理解JS闭包]帮助你快速学习js的闭包,简单高效的文档资源

    在 JavaScript 中,变量有全局作用域和局部作用域。全局变量在整个脚本中都可访问,而局部变量只在其所在函数内部有效。函数内部可以直接访问全局变量,但外部不能直接访问函数内部的局部变量。如果不使用 `var` ...

    最符合菜鸟的闭包

    4. **模块模式**:在JavaScript中,闭包常用于创建私有变量和方法,实现类似类的封装。通过闭包,可以创建只暴露特定接口的模块,隐藏内部实现细节。 5. **异步编程**:在处理异步操作如定时器或事件处理时,闭包...

    基于javascript 闭包基础分享

    文章中提到了两个例子:第一个例子中,通过一个循环来创建带有闭包的函数数组,但是由于JavaScript变量作用域和循环的作用,所有函数最终都只访问到了循环的最终值。第二个例子通过立即执行函数表达式(IIFE)来解决...

    局部变量线程安全测试

    例如,如果局部变量引用了非线程安全的对象(如全局变量、静态变量或者共享资源),或者通过某种方式(如闭包)使得局部变量的生命周期超出了其定义的代码块,那么就可能出现线程安全问题。因此,即使变量本身是局部...

    python中的闭包函数

    - 信息隐藏和模块化:闭包有助于模块化开发,可以将一些函数和变量封装在一个独立的作用域中,不对外暴露,增强代码的安全性。 闭包的使用示例: ```python def foo(): name = "python" # 外层函数的局部变量 ...

    浅谈JavaScript for循环 闭包_.docx

    本文将对JavaScript for循环和闭包进行浅谈,并提供六种解决方案来解决for循环中的闭包问题。 首先,让我们来看一个例子。我们有一个HTML文件,其中包含五个段落,每个段落都是一个p元素。我们想实现的是,每当点击...

    JS 闭包的理解

    1. **作用域**:在JavaScript中,变量的作用域分为两种,全局作用域和局部作用域。全局变量在整个代码中都可访问,而局部变量只在其定义的函数内部可用。当函数执行完毕,局部变量通常会被销毁。 2. **函数作用域**...

    closure闭包

    2. **数据封装**:闭包可以用来封装数据,因为它们可以访问和操作非局部变量,而这些变量对函数外部是不可见的。这种特性常用于创建私有变量和实现数据隐藏。 3. **状态持久化**:由于闭包能够记住变量的状态,所以...

    js闭包学习

    JavaScript中的闭包是一种强大的特性,它允许函数访问和操作其外部作用域内的变量,即使在外部函数执行完毕后,闭包依然能保持对外部变量的访问。闭包的关键在于,它能够保留函数内部状态,使得数据得以持久化,这...

    Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例

    本文实例讲述了Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作。分享给大家供大家参考,具体如下: 实例对象也可以实现闭包的功能,不过实例对象消耗的资源(内存)比闭包多。 demo.py(闭包): # 闭包,...

    Python闭包:深入理解与应用场景解析.zip

    Python闭包是编程语言中的一种高级特性,它在函数式编程和面向对象编程中都...在阅读《Python闭包:深入理解与应用场景解析.pdf》这份文档时,你将会更全面地了解闭包的工作原理,以及如何在实际项目中有效利用闭包。

    ios-闭包传值.zip

    闭包可以捕获和存储它所在上下文中的常量和变量,这使得它们非常适合用于异步操作、回调函数或者封装一系列相关操作。本教程将深入探讨如何在iOS应用中使用闭包进行值传递。 闭包的基本语法: 闭包的语法通常由花...

    js闭包的理解以及作用.docx

    JavaScript中的闭包是一种高级编程概念,它涉及到函数和作用域的相互作用,使得函数能够访问并操作其外部作用域中的变量,即使在其外部作用域已经结束之后。闭包是JavaScript中实现数据隐藏和封装的一种重要手段,...

    【JavaScript源代码】js闭包和垃圾回收机制示例详解.docx

    3. **私有化**:闭包可以用来创建私有变量和方法,这些变量和方法只能被闭包本身访问,而不能被全局作用域或其他函数访问。 4. **内存管理**:闭包中的变量会持续存在于内存中,直到不再被任何闭包引用为止,这可能...

    javascript深入理解js闭包.docx

    在JavaScript中,变量的作用域分为全局变量和局部变量。全局变量在整个脚本范围内都可访问,而局部变量只在其定义的函数内部可见。需要注意的是,如果在函数内部未使用`var`关键字声明变量,这个变量将默认为全局...

    Javascript 闭包完整解释

    当内部函数执行时,它首先查找其自身的局部作用域,如果找不到所需要的变量或函数,就会继续沿着作用域链向上查找,直到找到全局作用域为止。 ##### 2. 变量的作用域 变量的作用域决定了变量的生命期。在闭包中,...

Global site tag (gtag.js) - Google Analytics