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 相关文章推荐
解决css和js的{}与smarty定界符冲突问题的两种方法
Sep 10 Javascript
javascript简单性能问题及学习笔记
Feb 04 Javascript
jQuery遍历Table应用示例
Apr 09 Javascript
JavaScript函数获取事件源的小例子
May 14 Javascript
包含中国城市的javascript对象实例
Aug 03 Javascript
localStorage的黑科技-js和css缓存机制
Feb 06 Javascript
Angular4如何自定义首屏的加载动画详解
Jul 26 Javascript
vue采用EventBus实现跨组件通信及注意事项小结
Jun 14 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
浅谈laytpl 模板空值显示null的解决方法及简单的js表达式
Sep 19 Javascript
vue 子组件watch监听不到prop的解决
Aug 09 Javascript
在vue中嵌入外部网站的实现
Nov 13 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
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
ajax+php控制所有后台函数调用
2015/07/15 PHP
WordPress网站性能优化指南
2015/11/18 PHP
ZF框架实现发送邮件的方法
2015/12/03 PHP
PHP实现通过strace定位故障原因的方法
2018/04/29 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
javascript脚本编程解决考试分数统计问题
2008/10/18 Javascript
javascript 获取select下拉列表值的代码
2009/09/07 Javascript
javascript 哈希表(hashtable)的简单实现
2010/01/20 Javascript
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
jquery ready函数、css函数及text()使用示例
2013/09/27 Javascript
jquery使用append(content)方法注意事项分享
2014/01/06 Javascript
js jquery分别实现动态的文件上传操作按钮的添加和删除
2014/01/13 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
浅谈AngularJs 双向绑定原理(数据绑定机制)
2017/12/07 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
2019/04/04 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
PyTorch中topk函数的用法详解
2020/01/02 Python
python3+opencv生成不规则黑白mask实例
2020/02/19 Python
阿玛尼美妆英国官网:Giorgio Armani Beauty英国
2019/03/28 全球购物
大学生毕业的自我鉴定
2013/11/13 职场文书
活动邀请函范文
2014/01/19 职场文书
策划创业计划书
2014/02/06 职场文书
本科毕业生自荐信
2014/06/02 职场文书
三年级上册科学教学计划
2015/01/21 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
python百行代码实现汉服圈图片爬取
2021/11/23 Python