<html>
<head>
<title>elementFromPoint</title>
<script type="text/javascript">
window.onload = function(){
for(var i=0; i<6; i++){
var alink = document.createElement('a');
var titleText = document.createTextNode(' ' + (i+1) + ' ');
alink.appendChild(titleText);
alink.href = "javascript:void(0)";
alink.onclick = function(){alert(i)};
var div = document.getElementById('show-detail');
div.appendChild(alink);
}
}
</script>
</head>
<body> <div id="show-detail"> </div>
</body>
</html>

这是一组link,你会发现点击任何一个link,结果总是6。为什么?

解释:这是因为这6个link每次单击时,都会触发函数:function(){alert(i)};,这个函数的作用就是打印当前的i值,而添加完6个link标签后,内存中的i值已经变成了6,因此单击任何一个link,都会弹出6。

而我们的本意是想单击任何link时,都会弹出对应的数字,这该怎么解决?解决方法就是javascript的闭包特性

闭包--------------------------------------------------------------------------------------------------------------------------------------------

关于闭包,可以看以下网址:

http://www.jb51.net/article/24101.htm

闭包简单的说,就是当函数a的内部函数b被函数a外的一个变量C引用的时候,就创建了一个闭包。闭包的作用就是在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。例子如下:

function a(name)
{
var num=0;
function b()
{
alert("name:"+name+";num:"+num);
num++;
}
return b;
}
var c = a("c");
var d = a("d");
c(); //name:c;num:0
d(); //name:d;num:0
c(); //name:c;num:1
d(); //name:d;num:1

由于闭包特性,a一直存在于内存中,每一次运行c()或者d(),c和d对应的a对象都会num++。关于这一部分有一个作用域链的概念,不清楚的可以自己查查。

例子修改------------------------------------------------------------------------------------------------------------------------------------------

因此,对于上面的例子,我们可以修改如下:

<html>
<head>
<title>elementFromPoint</title>
<script type="text/javascript">
window.onload = function(){
for(var i=0; i<6; i++){
var alink = document.createElement('a');
var titleText = document.createTextNode(' ' + (i+1) + ' ');
alink.appendChild(titleText);
alink.href = "javascript:void(0)";
alink.onclick= showI(i);
var div = document.getElementById('show-detail');
div.appendChild(alink);
}
} function showI(i)
{
var num=0;
var a= function(){alert("i:"+i+";num:"+num++);}
return a;
}
</script>
</head>
<body> <div id="show-detail"> </div>
</body>
</html>

修改后可以看到,点击每一个link,都可以弹出对应的编号

alink.onclick= showI(i);   alink.onclick指向函数showI中的内部对象a,因此showI对象不会被GC回收,每一个alink对应一个showI对象,单击每一个alink时,会触发各自对应的showI对象;代码中生成了6个alink,同时为这6个alink分别分配了6个“闭包函数”showI(i),每一个闭包函数保存了alink对应的编号i。由于闭包特性,这6个showI对象不会被释放,一致存放于内存中,因此6个link分别单击时,会弹出相应的编号。

function showI(i)
{
    var num=0;   //这里加一个num,说明每一个link单击时,num++不会相互影响
    var a= function(){alert("i:"+i+";num:"+num++);}
    return a;
}

本文例子取自  http://blog.csdn.net/xiaohai0504/article/details/7735971

javascript闭包的一个例子的更多相关文章

  1. Java编程思想中关于闭包的一个例子

    Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...

  2. kettle modified javascript 步骤的一个例子

    例子里用到的 org.htmlparser.Parser 是一个html 的解析器,可以在 sourceforge 上下载. 这个例子使用 org.htmlparser.Parser 包来解析一个 h ...

  3. [译]Javascript中闭包的各种例子

    本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...

  4. 最简明的JavaScript闭包解释

    最简明的JavaScript闭包解释 JavaScript是这几年最火的编程语言之一,从前端到服务器端,再到脚本,好像没有一个地方没有JavaScript的身影.这个世界上任何的一种事物的存在必然有其 ...

  5. JavaScript闭包,只学这篇就够了

    # 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义. 其实只要理解了核心概念,闭包并不是那么的难于理解.但是,网上充斥了太多学术性的 ...

  6. JavaScript闭包只学这篇就够了

    闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义. 其实只要理解了核心概念,闭包并不是那么的难于理解.但是,网上充斥了太多学术性的文章 ...

  7. 最简单的例子理解Javascript闭包

    理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...

  8. JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】

    原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...

  9. JavaScript 闭包的例子

    例子出自<<JavaScript权威指南>>, 加上个人的理解和总结, 欢迎交流! /********************************************* ...

随机推荐

  1. HtmlEncode、HtmlDecode、UrlEncode、UrlDecode

    HtmlEncode: 将 Html 源文件中不允许出现的字符进行编码.例如:"<".">"."&" 等. HtmlDe ...

  2. .net 开源 JavaScript 解析引擎

    1. Javascript .NET 地址为:http://javascriptdotnet.codeplex.com/ 使用方法: Quick Start This section provides ...

  3. oracle定时任务JOB

    在jobs上点新建  what值:statisticsToDay;  这个是存储过程的名字间隔:sysdate+1/24   表示每个小时运行一次          1:每分钟执行 Interval ...

  4. LinkedHashMap和HashMap区别

    import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.uti ...

  5. LintCode "Subarray Sum II"

    Sliding window doesn't work. So it is a typical partial_sum base solution. As below. However if you ...

  6. PHP析构函数与垃圾回收

    析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行. GC (Garbage Collector) 在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾.PHP会将其在内存中销毁.这是PHP ...

  7. Spring实战2:装配bean—依赖注入的本质

    主要内容 Spring的配置方法概览 自动装配bean 基于Java配置文件装配bean 控制bean的创建和销毁 任何一个成功的应用都是由多个为了实现某个业务目标而相互协作的组件构成的,这些组件必须 ...

  8. Learning Puppet — Resource Ordering

    Learning Puppet — Resource Ordering Learn about dependencies and refresh events, manage the relation ...

  9. android学习笔记四

    TextView.Button.CheckBox.RadoiButton.EditView.ImageButton.ToogleButton——略 AnalogClock.DigitalClock = ...

  10. MySQL运行出错:无法连接驱动、无root访问权限解决办法

    按照疯狂java讲义的13.3的程序,发现程序运行出错. 1.点开runConnMySql.cmd运行文件,出现如下结果: 2.用Editplus进行编译运行,如下结果: 报错定位到程序第18行,而第 ...