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 的 prototype问题。
Jan 03 Javascript
Javascript 颜色渐变效果的实现代码
Oct 01 Javascript
javascript实现文本域写入字符时限定字数
Feb 12 Javascript
Js保留小数点的4种效果实现代码分享
Apr 12 Javascript
jQuery多条件筛选如何实现
Nov 04 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
Jun 21 Javascript
js 获取范围内的随机数实例代码
Aug 02 Javascript
webpack踩坑之路图片的路径与打包
Sep 05 Javascript
20个最常见的jQuery面试问题及答案
May 23 jQuery
Vue项目中添加锁屏功能实现思路
Jun 29 Javascript
Vue中的循环及修改差值表达式的方法
Aug 29 Javascript
js实现树形数据转成扁平数据的方法示例
Feb 27 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
十天学会php之第八天
2006/10/09 PHP
php结合安卓客户端实现查询交互实例
2015/05/05 PHP
一个支付页面DEMO附截图
2014/07/22 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
jquery实现搜索框功能实例详解
2018/07/23 jQuery
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
vue mounted 调用两次的完美解决办法
2018/10/29 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
2019/02/28 jQuery
layui关闭层级、简单监听的实例
2019/09/06 Javascript
JavaScript相等运算符的九条规则示例详解
2019/10/20 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
SpringBoot在yml配置文件中配置druid的操作
2020/11/16 Javascript
python实现windows下文件备份脚本
2018/05/27 Python
pytorch: tensor类型的构建与相互转换实例
2018/07/26 Python
PyQt5实现简易计算器
2020/05/30 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
解析Python 偏函数用法全方位实现
2020/06/26 Python
html5与css3小应用
2013/04/03 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
娇韵诗加拿大官网:Clarins加拿大
2017/11/20 全球购物
德国婴儿服装和婴儿用品购买网站:Baby Sweets
2019/12/08 全球购物
中海讯通笔试题
2015/09/15 面试题
国外软件测试工程师面试题
2016/12/09 面试题
班班通校本培训方案
2014/03/12 职场文书
幼儿园大班毕业教师寄语
2014/04/03 职场文书
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
80后婚前协议书范本
2014/10/24 职场文书
2014年中班下学期工作总结
2014/12/11 职场文书
浅谈Redis主从复制以及主从复制原理
2021/05/29 Redis
nginx配置虚拟主机的详细步骤
2021/07/21 Servers
python实现会员信息管理系统(List)
2022/03/18 Python
Python装饰器详细介绍
2022/03/25 Python