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 相关文章推荐
让innerHTML的脚本也可以运行起来
Jul 01 Javascript
prototype 源码中文说明之 prototype.js
Sep 22 Javascript
js修改table中Td的值(定义td的双击事件)
Jan 10 Javascript
jquery的live使用注意事项
Feb 18 Javascript
JavaScript学习笔记之JS事件对象
Jan 22 Javascript
jQuery判断多个input file 都不能为空的例子
Jun 23 Javascript
javascript实现的网站访问量统计代码
Dec 20 Javascript
JavaScript实现仿淘宝商品购买数量的增减效果
Jan 22 Javascript
connection reset by peer问题总结及解决方案
Oct 21 Javascript
vue最简单的前后端交互示例详解
Oct 11 Javascript
vue使用v-if v-show页面闪烁,div闪现的解决方法
Oct 12 Javascript
基于JavaScript实现猜数字游戏代码实例
Jul 30 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
根据分辨率不同,调用不同的css文件
2006/07/07 Javascript
使用jquery动态加载javascript以减少服务器压力
2012/10/29 Javascript
javascript和jquery实现设置和移除文本框默认值效果代码
2015/01/13 Javascript
JQuery中DOM事件冒泡实例分析
2015/06/13 Javascript
深入理解jquery自定义动画animate()
2016/05/24 Javascript
jquery attr()设置和获取属性值实例教程
2016/09/25 Javascript
Bootstrap学习笔记 轮播(Carousel)插件
2017/03/21 Javascript
Vue Ajax跨域请求实例详解
2017/06/20 Javascript
jqgrid实现简单的单行编辑功能
2017/09/30 Javascript
vue.js内置组件之keep-alive组件使用
2018/07/10 Javascript
vue项目中,main.js,App.vue,index.html的调用方法
2018/09/20 Javascript
javascript中的闭包概念与用法实践分析
2019/07/26 Javascript
解决Vue 刷新页面导航显示高亮位置不对问题
2019/12/25 Javascript
Vue打包部署到Nginx时,css样式不生效的解决方式
2020/08/03 Javascript
[20:46]Ti4循环赛第三日VG vs DK
2014/07/12 DOTA
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python set集合类型操作总结
2014/11/07 Python
将Python代码嵌入C++程序进行编写的实例
2015/07/31 Python
打包发布Python模块的方法详解
2016/09/18 Python
详解Python并发编程之创建多线程的几种方法
2019/08/23 Python
opencv3/C++ 平面对象识别&amp;透视变换方式
2019/12/11 Python
python设置环境变量的作用整理
2020/02/17 Python
python使用PIL剪切和拼接图片
2020/03/23 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
HTML5 Canvas的事件处理介绍
2015/04/24 HTML / CSS
美国嘻哈首饰购物网站:Hip Hop Bling
2016/12/30 全球购物
送给他或她的礼物:FUN.com
2018/08/17 全球购物
英国文具、办公用品和科技商店:Ryman
2018/09/27 全球购物
JAVA语言如何进行异常处理,关键字:throws,throw,try,catch,finally分别代表什么意义?在try块中可以抛出异常吗?
2013/07/02 面试题
大学生自我鉴定书
2014/03/24 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
道路交通事故人身损害赔偿协议书
2014/11/19 职场文书
杭白菊导游词
2015/02/10 职场文书
golang中的struct操作
2021/11/11 Golang
JS实现页面炫酷的时钟特效示例
2022/08/14 Javascript
Flink 侧流输出源码示例解析
2022/09/23 Servers