`
zhouyrt
  • 浏览: 1163741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript闭包演示

阅读更多

有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p,就alert出对应的1,2,3,4,5。

 

<html > 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>闭包演示</title> 
<script type="text/javascript"> 

function init() { 
    var pAry = document.getElementsByTagName("p"); 
    for( var i=0; i<pAry.length; i++ ) { 
         pAry[i].onclick = function() { 
         alert(i); 
    } 
  } 
} 
</script> 
</head> 
<body onload="init();"> 
<p>产品一</p> 
<p>产品二</p> 
<p>产品三</p> 
<p>产品四</p> 
<p>产品五</p> 
</body> 
</html> 

 

解决方式有两种,


1、将变量 i 保存给在每个段落对象(p)上

 

function init() { 
  var pAry = document.getElementsByTagName("p"); 
  for( var i=0; i<pAry.length; i++ ) { 
     pAry[i].i = i; 
     pAry[i].onclick = function() { 
        alert(this.i); 
     } 
  } 
} 

 

2、将变量 i 保存在匿名函数自身 

 

function init2() { 
  var pAry = document.getElementsByTagName("p"); 
  for( var i=0; i<pAry.length; i++ ) {   
   (pAry[i].onclick = function() { 
        alert(arguments.callee.i); 
    }).i = i; 
  } 
} 

 

再增加3种

 

3、加一层闭包,i以函数参数形式传递给内层函数

 

function init3() { 
  var pAry = document.getElementsByTagName("p"); 
  for( var i=0; i<pAry.length; i++ ) { 
   (function(arg){     
       pAry[i].onclick = function() {     
          alert(arg); 
       }; 
   })(i);//调用时参数 
  } 
} 

 

4、加一层闭包,i以局部变量形式传递给内存函数

 

function init4() { 
  var pAry = document.getElementsByTagName("p"); 
  for( var i=0; i<pAry.length; i++ ) {   
    (function () { 
      var temp = i;//调用时局部变量 
      pAry[i].onclick = function() {   
        alert(temp);   
      } 
    })(); 
  } 
} 

 

5、加一层闭包,返回一个函数作为响应事件(注意与3的细微区别)

 

function init5() { 
  var pAry = document.getElementsByTagName("p"); 
  for( var i=0; i<pAry.length; i++ ) {   
   pAry[i].onclick = function(arg) { 
       return function() {//返回一个函数 
       alert(arg); 
     } 
   }(i); 
  } 
}

 

又有一种方法

 

 

6、用Function实现,实际上每产生一个函数实例就会产生一个闭包

 

function init6() { 
    var pAry = document.getElementsByTagName("p"); 
    for( var i=0; i<pAry.length; i++ ) {   
      pAry[i].onclick = new Function("alert(" + i + ");");//new一次就产生一个函数实例
    } 
}

 

 

再增加一种

7、用Function实现,注意与6的区别

 

function init7() { 
    var pAry = document.getElementsByTagName("p"); 
    for( var i=0; i<pAry.length; i++ ) { 
         pAry[i].onclick = Function('alert('+i+')')
    } 
} 
29
1
分享到:
评论
7 楼 chb2java 2010-11-19  
早看早受益!
6 楼 xkxmud 2010-08-10  
 
5 楼 CrystalBear 2010-06-08  
第一种方法最好,楼主功力很深哦,竟然知道这么多写法
4 楼 CrystalBear 2010-06-08  
闭包中的i是外部函数中变量i的一个引用,当init执行结束后i的值为5,所以p的onclick调用闭包时,i的值已经是5,
3 楼 yin_bp 2010-05-18  
 
2 楼 xiaomimishiye 2010-05-13  
lmh2072005 写道


1 楼 lmh2072005 2010-05-10  

相关推荐

    Javascript闭包演示代码小结

    闭包演示 p {background:gold;} function init() { var pAry = document.getElementsByTagName(“p”); for( var i=0; i 产品 0 产品 1 产品 2 产品 3 产品 4 [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]...

    javascript 闭包实例下载

    JavaScript 闭包是一种高级编程概念,它在JavaScript中扮演着至关重要的角色,特别是在函数式编程和模块化设计中。闭包本质上是函数和其能够访问...通过学习这些实例,你将能够更好地掌握JavaScript闭包这一核心概念。

    JavaScript对闭包的理解.md

    为了帮助大家快速和较好地理解JavaScript函数中的闭包,本文对JavaScript的闭包进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。

    javascript演示程序

    在这个"javascript演示程序"中,我们可以深入理解JavaScript的核心概念和常见应用。 首先,JavaScript的基本语法与C++和Java类似,它包括变量、数据类型(如字符串、数字、布尔值、对象等)、运算符、控制结构(如...

    javascript代码和网页演示

    在本资料的"javascript代码和网页演示_PART4"中,可能包含了一些高级话题,如事件处理、AJAX异步通信、闭包、原型链等。事件处理是JavaScript与用户交互的关键,当用户点击按钮、滚动页面等,对应的事件处理器会被...

    理解javascript闭包

    JavaScript闭包是这门语言的核心概念之一,它允许函数访问外部函数中的局部变量、参数和内部定义的其他函数。闭包的创建通常发生在函数被返回并赋值给一个全局变量时,即使外部函数已经执行完毕,这些变量也不会被...

    闭包演示小

    闭包是JavaScript编程中一个非常重要的概念,它在函数式编程和对象封装中扮演着核心角色。闭包简单来说就是能够记住其词法作用域(定义时的作用域)的函数,即使该函数在外部作用域被调用。这种特性使得闭包在管理...

    javascript经典特效---病毒入侵演示.rar

    7. **闭包**:JavaScript的闭包特性可以用来管理作用域,保护内部变量不被外部访问,同时在动画执行过程中保持状态。 8. **性能优化**:对于大规模的病毒元素,可能需要考虑性能优化,比如使用...

    JavaScript 例子(JavaScript 源码html格式)

    例子将演示如何处理回调函数、Promise链式调用以及异步操作的错误处理。 7. **JavaScript模板字符串**:模板字符串是ES6引入的新特性,允许在字符串中嵌入表达式。例子可能包含使用模板字符串构建动态HTML内容的...

    Closures:这个存储库包含 JavaScript Closure 演示

    这个存储库包含JavaScript Closure演示。 在我们开始讨论闭包之前,重要的是我们理解以下术语,因为它们将构成我们对闭包的整个理解的基线: 1. 词法范围 词法是指语言或文本。 范围是指与文本相关的属性。 词法...

    带演示的常用Javascript特效代码集

    这个"带演示的常用Javascript特效代码集"包含了多种常见的JavaScript特效实现,对于开发者来说是一份宝贵的参考资料。以下是对其中可能包含的知识点的详细说明: 1. **DOM操作**:在JavaScript中,DOM(Document ...

    JavaScript学习笔记-适合初学者

    最后,"JavaScript.ppt"可能是JavaScript的演示文稿,包含了语言的主要知识点和实例,可能涵盖从基础到进阶的主题,如闭包、异步编程、AJAX(异步JavaScript和XML)以及ES6的新特性,如箭头函数、模板字符串、...

    顽皮的闭包

    通常,开发者会编写测试用例来演示闭包如何工作,例如,如何使用闭包来保存状态、创建私有变量或者实现异步操作的回调函数等。 在标签中,“源码”意味着我们将探讨闭包在实际代码中的应用,理解其底层工作原理。而...

    浅谈JavaScript for循环 闭包

    有个网友问了个问题,如下的html,为什么每次输出都是5,而不是点击每个p...闭包演示&lt;/title&gt; [removed] function init() { var pAry = document.getElementsByTagName(p); for( var i=0; i&lt;pAry.length; i

    精通JavaScript(John Resig)

    书中详细阐述了这些基础知识,并通过实例演示如何在实际编程中应用它们。 其次,JavaScript的面向对象特性是其重要组成部分。书中会讲解如何使用构造函数、原型链以及闭包来实现面向对象编程。此外,ES6引入的类和...

    javascript 常见的闭包问题的解决办法

    –这就是闭包的问题 原来 在js中,函数中在定义函数,就出现闭包了。此时外层函数中变量是可以在里层函数里利用的,即使外层函数结束。但是当外层中出现循环的时候,如果在里层函数中利用这个循环变量的话,会直接...

Global site tag (gtag.js) - Google Analytics