我们先看一个关于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. 10月27日PHP加载类、设计模式(单例模式和工厂模式)、面向对象的六大原则

    加载类可以使用include.require.require_once三种中的任意一种,每个关键字都有两种方法,但是这种方法的缺点是需要加载多少个php文件,就要写多少个加载类的方法.一般也就需要加载 ...

  2. MYSQL存储过程、游标、触发器

    MySQL5 中添加了存储过程的支持. 大多数SQL语句都是针对一个或多个表的单条语句.并非所有的操作都怎么简单.经常会有一个完整的操作需要多条才能完成  存储过程简单来说,就是为以后的使用而保存的一 ...

  3. 概率论与数理统计图解.tex

    \documentclass[UTF8,a1paper,landscape]{ctexart} \usepackage{tikz} \usepackage{amsmath} \usepackage{a ...

  4. Atom编辑器的插件

    先说下atom的插件安装方法吧,因为没用过苹果电脑,所以这里就只说下windows的操作吧. " ctrl+, "调出设置面板 点击install按钮,进去搜索插件面板 1.exp ...

  5. IIS ARR 负载均衡

    阅读:http://www.cnblogs.com/jesse2013/p/dlws-loadbalancer2.html 自定义端口:http://www.th7.cn/Program/net/20 ...

  6. 使用excel结合线性规划求解Holt-Winters参数

      其实上面这个是Holt-Winters无季节趋势模型, 上面的S(t)对应下面的a(t)——截距(平滑值)            b(t)仍然对应b(t)——趋势,T对应k.           ...

  7. glusterFS系统中文管理手册(转载)

    GlusterFS系统中文管理手册       1文档说明 该文档主要内容出自 www.gluster.org 官方提供的英文系统管理手册<Gluster File System 3.3.0 A ...

  8. SQL中SET和SELECT赋值的区别

    最近的项目写的SQL比较多,经常会用到对变量赋值,而我使用SET和SELECT都会达到效果. 那就有些迷惑,这两者有什么区别呢?什么时候哪该哪个呢? 经过网上的查询,及个人练习,总结两者有以下几点主要 ...

  9. linuxmint 17安装scim输入法

    安装输入法框架: sudo apt-get install scim 安装输入法: sodu apt-get install scim-pinyin 此时启动的输入法的候选词框不随着光标移动,需要安装 ...

  10. Mac Pro 资源管理器 Double Commander“个性化设置” 备份

    操作系统自带的资源管理器,总是有些别扭的地方,在 Windows 系统下,我一般用 Total Commander(破解版)来作为替代品.现在换为 Mac 系统,自带的 Finer 也不怎么好用,连最 ...