我们先看一个关于Javascript利用循环绑定事件的例子:

例如:一个不确定长度的列表,在鼠标经过某一条的时候改变背景。

 
﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥   
﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥   
﹤head﹥   
﹤title﹥Untitled Page﹤/title﹥   
﹤/head﹥   
﹤body﹥   
﹤ul id="list"﹥   
﹤li﹥第1条记录﹤/li﹥   
﹤li﹥第2条记录﹤/li﹥   
﹤li﹥第3条记录﹤/li﹥   
﹤li﹥第4条记录﹤/li﹥   
﹤li﹥第5条记录﹤/li﹥   
﹤li﹥第6条记录﹤/li﹥   
﹤/ul﹥   
﹤script type="text/javascript"﹥   
var list_obj = document.getElementById("list").getElementsByTagName("li"); //获取list下面的所有li的对象数组    
for (var i = 0; i ﹤= list_obj.length; i++) {    
list_obj[i].onmousemove = function() {    
this.style.backgroundColor = "#cdcdcd";    
}    
list_obj[i].onmouseout = function() {    
this.style.backgroundColor = "#FFFFFF";    
}    
}    
﹤/script﹥   
﹤/body﹥   
﹤/html﹥

这个例子循环为一组对象绑定事件处理函数。

但是,如果我们在这个基础上增加一些需求。比如在点击某一条记录的时候弹出这是第几条记录?

可能你会理所当然的这么写:

 

﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥   
﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥   
﹤head﹥   
﹤title﹥Untitled Page﹤/title﹥   
﹤/head﹥   
﹤body﹥   
﹤ul id="list"﹥   
﹤li﹥第1条记录﹤/li﹥   
﹤li﹥第2条记录﹤/li﹥   
﹤li﹥第3条记录﹤/li﹥   
﹤li﹥第4条记录﹤/li﹥   
﹤li﹥第5条记录﹤/li﹥   
﹤li﹥第6条记录﹤/li﹥   
﹤/ul﹥   
﹤script type="text/javascript"﹥   
var list_obj = document.getElementById("list").getElementsByTagName("li"); //获取list下面的所有li的对象数组    
for (var i = 0; i ﹤= list_obj.length; i++) {    
list_obj[i].onmousemove = function() {    
this.style.backgroundColor = "#cdcdcd";    
}    
list_obj[i].onmouseout = function() {    
this.style.backgroundColor = "#FFFFFF";    
}    
list_obj[i].onclick = function() {    
alert("这是第" + i + "记录");    
}    
}    
﹤/script﹥   
﹤/body﹥   
﹤/html﹥

测试一下你会发现alert出来的都是:这是第6记录

其实这里for循环已将整个列表循环了一遍,并执行了i++,所以这里i变成了6,

有什么好的办法解决这个问题吗?

那就是闭包了,个人认为闭包是js中最难捉摸的地方之一,

看看什么是闭包:

闭包时是指内层的函数可以引用存在与包围他的函数内的变量,即使外层的函数的执行已经终止。

可以查阅:http://www.css88.com/article.asp?id=469

这个例子中我们可以这样做:


﹤!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"﹥   
﹤html xmlns="http://www.w3.org/1999/xhtml" ﹥   
﹤head﹥   
﹤title﹥Untitled Page﹤/title﹥   
﹤/head﹥   
﹤body﹥   
﹤ul id="list"﹥   
﹤li﹥第1条记录﹤/li﹥   
﹤li﹥第2条记录﹤/li﹥   
﹤li﹥第3条记录﹤/li﹥   
﹤li﹥第4条记录﹤/li﹥   
﹤li﹥第5条记录﹤/li﹥   
﹤li﹥第6条记录﹤/li﹥   
﹤/ul﹥   
﹤script type="text/javascript"﹥   
function tt(nob) {    
this.clickFunc = function() {    
alert("这是第" + (nob + 1) + "记录");    
}    
}    
var list_obj = document.getElementById("list").getElementsByTagName("li"); //获取list下面的所有li的对象数组    
for (var i = 0; i ﹤= list_obj.length; i++) {    
list_obj[i].onmousemove = function() {    
this.style.backgroundColor = "#cdcdcd";    
}    
list_obj[i].onmouseout = function() {    
this.style.backgroundColor = "#FFFFFF";    
}    
var col = new tt(i);    
list_obj[i].onclick = col.clickFunc;    
}    
﹤/script﹥   
﹤/body﹥   
﹤/html﹥

摘自:http://www.cnblogs.com/angells/archive/2009/11/19/1606439.html

js闭包Demo的更多相关文章

  1. 让你分分钟学会 JS 闭包

    闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  2. js闭包vs Java内部类

    前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...

  3. 简单详细讲解js闭包(看完不懂你砍我!!!)

    <javascript高级程序设计>中闭包的概念: 闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作般在函数中定义实例(局部)变量,而这些变量 ...

  4. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  5. 大部分人都会做错的经典JS闭包面试题

    由工作中演变而来的面试题 这是一个我工作当中的遇到的一个问题,似乎很有趣,就当做了一道题去面试,发现几乎没人能全部答对并说出原因,遂拿出来聊一聊吧. 先看题目代码: function fun(n,o) ...

  6. Three.js基本 Demo

    对于新手来说,几个简单的例子非常实用,偶然发现几个不错的Demo,分享给大家! Three.js基本 Demo 1.最基本的Hello World:http://stemkoski.github.io ...

  7. Js闭包常见三种用法

        Js闭包特性源于内部函数可以将外部函数的活动对象保存在自己的作用域链上,所以使内部函数的可以将外部函数的活动对象占为己有,可以在外部函数销毁时依然存有外部函数内的活动对象内容,这样做的好处是可 ...

  8. js闭包之初步理解( JavaScript closure)

    闭包一直是js中一个比较难于理解的东西,而平时用途又非常多,因此不得不对闭包进行必要的理解,现在来说说我对js闭包的理解. 要理解闭包,肯定是要先了解js的一个重要特性, 回想一下,那就是函数作用域, ...

  9. (原创)JS闭包看代码理解

    <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="C ...

随机推荐

  1. AE开发中栅格图层实现分级渲染

    GP工具IDW执行后,生成的栅格图层是黑白二色,需要手动进行分级渲染,似乎不是所有栅格图层都可以进行分级渲染,注意异常处理.注意ARCMAP中是有颜色的,无需自己处理. IRasterClassify ...

  2. thinkphp 模型、控制器、视图

    控制器里面调用模型 echo D('Goods')->index(); 调用GoodsModel下index 控制器里面调用其他控制器 echo A('Goods')->index(); ...

  3. QT读取文本(字符串)最后一行的方法

    QString str; QTextStream ts(&str); str = this->toPlainText(); ts.seek(str.lastIndexOf("- ...

  4. [Head First设计模式]生活中学设计模式——状态模式

    系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...

  5. DTD总结

    DTD 可以检测 XNM 文档的结构是否正确,就好像文章中用来保证结构正确的语法规则一样. 引入 DTD 1.引入私有的 DTD 文件,URI 可以使相对地址或绝对地址 <!DOCTYPE 根元 ...

  6. 2013成都网络赛 C We Love MOE Girls(水题)

    We Love MOE Girls Time Limit: 1000/500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 知识联结梳理 : I/O多路复用、EPOLL(SELECT/POLL)、NIO、Event-driven、Reactor模式

    为了形成一个完整清晰的认识,将概念和关系梳理出来,把坑填平. I/O多路复用 I/O多路复用主要解决传统I/O单线程阻塞的问题.它通过单线程管理多个FD,当监听的FD有状态变化的时候的,调用回调函数, ...

  8. 倾力总结40条常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊.   用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率 ...

  9. SET基本数据类型

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAADZCAIAAACo85tgAAAgAElEQVR4Aey9SdAs13XnV/P8jW8e8D

  10. 下拉列表 select-option ; select-optgroup-option

    HTML中的下拉列表: <select> <option value ="1">Volvo</option> <option value  ...