javascript自启动函数的问题探讨


Posted in Javascript onOctober 05, 2013

话不多说了。

先来看两段代码:

var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { 
alert(i); 
elems[i].addEventListener('click', function (e) { 
e.preventDefault(); 
alert('I am link #' + i); 
}, 'false'); 
}

再看一面一段:
var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { 
(function(index){ 
elems[i].addEventListener('click', function (e) { 
e.preventDefault(); 
alert('I am link #' + index); 
}, 'false'); 
})(i); 
}

HTML 代码如下:
<body> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
<a href = "#">a</a> 
</body>

你可以想像下,前后两段 script代码的效果。

如果你能看出来效果的区别,那么恭喜你。至少我思考了很久,才明白里面的玄妙。

是的。你没有看错,这里的第一段代码,无论你点击哪一个链接,输出的都是 I am link # 8.

第二段代码,才是你真正想要的结果,那么为什么呢。

看下面的代码:

var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { 
alert(i); 
elems[i].addEventListener('click', function (e) { 
e.preventDefault(); 
alert('I am link #' + i); 
//注意这里的回调函数只有的触发的时候才会启动 
//一样,这里的i的值也一样在循环结束的时候也变化了 
}, 'false'); 
//原因在于 
//这里的elems[i] 虽然是引用的元素 
//但是回调函数中的i 已经在循环结束后 
//变成了8(如果 elems 的长度是 8 的话) 
}

var elems = document.getElementsByTagName('a'); for (var i = 0; i < elems.length; i++) { 
(function(index){ 
elems[i].addEventListener('click', function (e) { 
e.preventDefault(); 
alert('I am link #' + index); 
}, 'false'); 
})(i); 
//而这里的则不一样 
//虽然循环结束后i 的值变成了8 
//但是在封装在闭包内的index 确实一直被locked 住的 
//一直保存在内存中。 
//准确的说 应该是整个函数都lock在内存中. 
}

这里可能需要一些javascript闭包的知识。

以上代码,想了很久,记录下来,以防止忘记。

Javascript 相关文章推荐
javascript入门·对象属性方法大总结
Oct 01 Javascript
为EasyUI的Tab标签添加右键菜单的方法
Jul 14 Javascript
js正文内容高亮效果的实现方法
Jun 30 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
Nov 12 Javascript
js实现在网页上简单显示时间的方法
Mar 02 Javascript
关于function类中定义变量this的简单说明
May 28 Javascript
js 连续赋值的简单实现
Jun 13 Javascript
AngularJS实现ajax请求的方法
Nov 22 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
Jan 19 Javascript
JavaScript 中 apply 、call 的详解
Mar 21 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
Apr 14 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
Sep 25 Javascript
纯js简单日历实现代码
Oct 05 #Javascript
JS教程:window.location使用方法的区别介绍
Oct 04 #Javascript
js中单引号与双引号冲突问题解决方法
Oct 04 #Javascript
jquery parent和parents的区别分析
Oct 02 #Javascript
jQuery插件 selectToSelect使用方法
Oct 02 #Javascript
jquery定时滑出可最小化的底部提示层特效代码
Oct 02 #Javascript
jquery实现多级下拉菜单的实例代码
Oct 02 #Javascript
You might like
Dedecms常用函数解析
2008/02/01 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
WordPress中登陆后关闭登陆页面及设置用户不可见栏目
2015/12/31 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
nodejs 提示‘xxx’ 不是内部或外部命令解决方法
2014/11/20 NodeJs
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
jQuery form插件的使用之处理server返回的JSON, XML,HTML数据
2016/01/26 Javascript
实现点击下箭头变上箭头来回切换的两种方法【推荐】
2016/12/14 Javascript
理解javascript中的闭包
2017/01/11 Javascript
js中DOM三级列表(代码分享)
2017/03/20 Javascript
详解如何使用webpack+es6开发angular1.x
2017/08/16 Javascript
使用react实现手机号的数据同步显示功能的示例代码
2018/04/03 Javascript
Layui 数据表格批量删除和多条件搜索的实例
2019/09/04 Javascript
jQuery操作元素追加内容示例
2020/01/10 jQuery
vue使用map代替Aarry数组循环遍历的方法
2020/04/30 Javascript
支付宝小程序实现省市区三级联动
2020/06/21 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
采用Psyco实现python执行速度提高到与编译语言一样的水平
2014/10/11 Python
python用来获得图片exif信息的库实例分析
2015/03/16 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
编写Python小程序来统计测试脚本的关键字
2016/03/12 Python
Python numpy实现数组合并实例(vstack,hstack)
2018/01/09 Python
Python爬豆瓣电影实例
2018/02/23 Python
python钉钉机器人运维脚本监控实例
2019/02/20 Python
python框架flask表单实现详解
2019/11/04 Python
7款设计巧妙的css3飘带状3D立体效果的导航菜单和表单窗口
2013/02/04 HTML / CSS
优秀实习自我鉴定
2013/12/04 职场文书
新驾驶员个人自我评价
2014/01/03 职场文书
校园学雷锋广播稿
2014/10/08 职场文书
单位介绍信格式
2015/01/31 职场文书
湘江北去观后感
2015/06/15 职场文书
圣诞晚会主持词
2015/07/01 职场文书
MYSQL主从数据库同步备份配置的方法
2021/05/26 MySQL
教你如何使用Python实现二叉树结构及三种遍历
2021/06/18 Python
提高系统的吞吐量解决数据库重复写入问题
2022/04/23 MySQL