javascript闭包的一个例子
<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闭包的一个例子的更多相关文章
- Java编程思想中关于闭包的一个例子
Java编程思想中的一个例子,不是很理解使用闭包的必要性,如果不使用闭包,是不是有些任务就不能完成?继续探索. package InnerClass; interface Incrementable ...
- kettle modified javascript 步骤的一个例子
例子里用到的 org.htmlparser.Parser 是一个html 的解析器,可以在 sourceforge 上下载. 这个例子使用 org.htmlparser.Parser 包来解析一个 h ...
- [译]Javascript中闭包的各种例子
本文翻译youtube上的up主kudvenkat的javascript tutorial播放单 源地址在此: https://www.youtube.com/watch?v=PMsVM7rjupU& ...
- 最简明的JavaScript闭包解释
最简明的JavaScript闭包解释 JavaScript是这几年最火的编程语言之一,从前端到服务器端,再到脚本,好像没有一个地方没有JavaScript的身影.这个世界上任何的一种事物的存在必然有其 ...
- JavaScript闭包,只学这篇就够了
# 闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义. 其实只要理解了核心概念,闭包并不是那么的难于理解.但是,网上充斥了太多学术性的 ...
- JavaScript闭包只学这篇就够了
闭包不是魔法 这篇文章使用一些简单的代码例子来解释JavaScript闭包的概念,即使新手也可以轻松参透闭包的含义. 其实只要理解了核心概念,闭包并不是那么的难于理解.但是,网上充斥了太多学术性的文章 ...
- 最简单的例子理解Javascript闭包
理解Javascript的闭包非常关键,本篇试图用最简单的例子理解此概念. function greet(sth){ return function(name){ console.log(sth + ...
- JavaScript 作用域和闭包——另一个角度:扩展你对作用域和闭包的认识【翻译+整理】
原文地址 --这篇文章有点意思,可以扩展你对作用域和闭包的认识. 本文内容 背景 作用域 闭包 臭名昭著的循环问题 自调用函数(匿名函数) 其他 我认为,尝试向别人解释 JavaScript 作用域和 ...
- JavaScript 闭包的例子
例子出自<<JavaScript权威指南>>, 加上个人的理解和总结, 欢迎交流! /********************************************* ...
随机推荐
- 【转】JavaScript实际应用:父子页面交互
转自:http://blog.csdn.net/xinyueyuli/article/details/509893 最近项目开发中需要子窗口和父窗口交互的内容,基本上无非就是把子窗口的信息传递给父窗口 ...
- IntelliJ IDEA中配置reportNG
找了好多资料,各种设置都是eclipse上面的.后来发现原来就在Run->Edit Configurations->TestNG->Configuration->Listenn ...
- python数据库操作pymysql
安装数据库: pip3 install pymysql 进行数据库的更新.插入.查询等操作: #!/usr/bin/python3.4 # -*- coding: utf-8 -*- #------- ...
- excel 组及分级显示制作教程
1.思路:利用“组及分级显示”功能,将每一个项目作为“摘要行”,将需要被“收起”或“展开”的内容,也就是项目所包含的内容作为“明细数据行.2.制作方法: 方法1:使用手工“组合”例如下图中,A2代表的 ...
- selenium+python自动化之pycharm
方法: 1.注册机界面,选择License serve.填入http://www.cnblogs.com/testdream/ 2.点击ok 3.注册界面选择:Activation coede 4.打 ...
- ASP.NET 4.0的ClientIDMode属性
时光流逝,我们心爱的ASP.NET也步入了4.0的时代,微软在ASP.NET 4.0中对很多特性做了修改.比如我将要讨论的控件ID机制就是其中之一. 在ASP.NET 4.0之前我们总是要为控件的Cl ...
- ASP.NET MVC 中的ViewData与ViewBag
在Asp.net MVC 3 web应用程序中,我们会用到ViewData与ViewBag,对比一下: ViewData ViewBag 它是Key/Value字典集合 它是dynamic类型对像 从 ...
- Android 6.0删除Apache HttpClient相关类的解决方法
相应的官方文档如下: 上面文档的大致意思是,在Android 6.0(API 23)中,Google已经移除了Apache HttpClient相关的类,推荐使用HttpUrlConnection. ...
- Rsync企业实战之自动异地备份(转)
认真的测试过网上的大多数文章和版本,真正能一次性测试通过的文章太少了,需要反复的推敲,反复的查阅资料,才能真正的测试成功,所以,在此背景下,总结了Rsync,加上自己的理解分享出来: 1. 原理篇 R ...
- HackerRank "AND xor OR"
Actually I think problem statement is somewhat misleading. No need to mention range [L, R] at all. T ...