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判断对象是否相等实现代码
Mar 18 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
Nov 21 Javascript
javascript分页代码实例分享(js分页)
Dec 13 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
JS实现的仿淘宝交易倒计时效果
Nov 27 Javascript
JavaScript语言精粹经典实例(整理篇)
Jun 07 Javascript
避免jQuery名字冲突 noConflict()方法
Jul 30 Javascript
JavaScript用200行代码制作打飞机小游戏实例
Jun 21 Javascript
关于React动态加载路由处理的相关问题
Jan 07 Javascript
js简单的分页器插件代码实例
Sep 11 Javascript
JS回调函数简单易懂的入门实例分析
Sep 29 Javascript
JavaScript 常见的继承方式汇总
Sep 17 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文件夹与文件目录操作函数介绍
2013/09/09 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
php数组冒泡排序算法实例
2016/05/06 PHP
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
jQuery实现连续动画效果实例分析
2015/10/09 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
jQuery 3.0十大新特性最终版发布
2016/07/14 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
Angular中sweetalert弹框的基本使用教程
2018/07/22 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
解决vue中使用less/sass及使用中遇到无效的问题
2020/10/24 Javascript
Python 爬虫学习笔记之正则表达式
2016/09/21 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
解决python Markdown模块乱码的问题
2019/02/14 Python
使用Python制作简单的小程序IP查看器功能
2019/04/16 Python
pandas的排序和排名的具体使用
2019/07/31 Python
如何基于python实现归一化处理
2020/01/20 Python
python实现图像全景拼接
2020/03/27 Python
python实现定时发送邮件
2020/12/23 Python
如何用border-image实现文字气泡边框的示例代码
2020/01/21 HTML / CSS
担保书格式及范文
2014/04/01 职场文书
行政求职信
2014/07/04 职场文书
购房委托书范本
2014/09/18 职场文书
给老师的一封感谢信
2015/01/20 职场文书
简历自我评价优缺点
2015/03/11 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
罚款通知怎么写
2015/04/22 职场文书
违规违纪检讨书范文
2015/05/06 职场文书
字典算法实现及操作 --python(实用)
2021/03/31 Python
Vue实现tab导航栏并支持左右滑动功能
2021/06/28 Vue.js