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 相关文章推荐
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
Sep 03 Javascript
js实现div闪烁原理及实现代码
Jun 24 Javascript
JavaScript数组对象赋值用法实例
Aug 04 Javascript
Bootstrap CSS组件之导航(nav)
Dec 17 Javascript
微信小程序 MD5的方法详解及实例代码
Mar 10 Javascript
基于bootstrap实现多个下拉框同时搜索功能
Jul 19 Javascript
Canvas放置反弹效果随机图形(实例)
Aug 17 Javascript
Vue组件和Route的生命周期实例详解
Feb 10 Javascript
vue2.0 资源文件assets和static的区别详解
Apr 08 Javascript
在小程序中使用腾讯视频插件播放教程视频的方法
Jul 10 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
完美解决通过IP地址访问VUE项目的问题
Jul 18 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数组操作汇总 php数组的使用技巧
2011/07/17 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
PHP CURL实现模拟登陆并上传文件操作示例
2020/01/02 PHP
Google Map V3 绑定气泡窗口(infowindow)Dom事件实现代码
2013/04/26 Javascript
JavaScript中的标签语句用法分析
2015/02/10 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
JavaScript包装对象使用详解
2015/07/09 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
JS实现json对象数组按对象属性排序操作示例
2018/05/18 Javascript
解决jquery的ajax调取后端数据成功却渲染失败的问题
2018/08/08 jQuery
vue+axios 前端实现的常用拦截的代码示例
2018/08/23 Javascript
微信小程序学习笔记之获取位置信息操作图文详解
2019/03/29 Javascript
Python中optparse模块使用浅析
2015/01/01 Python
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
详解django中自定义标签和过滤器
2017/07/03 Python
Python微信企业号开发之回调模式接收微信端客户端发送消息及被动返回消息示例
2017/08/21 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
matplotlib设置legend图例代码示例
2017/12/19 Python
Python学习之Anaconda的使用与配置方法
2018/01/04 Python
django创建超级用户过程解析
2019/09/18 Python
更新升级python和pip版本后不生效的问题解决
2020/04/17 Python
Python unittest单元测试框架实现参数化
2020/04/29 Python
TensorFlow的环境配置与安装教程详解(win10+GeForce GTX1060+CUDA 9.0+cuDNN7.3+tensorflow-gpu 1.12.0+python3.5.5)
2020/06/22 Python
keras K.function获取某层的输出操作
2020/06/29 Python
美国创意之家:BulbHead
2017/07/12 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
J2EE面试题集锦(附答案)
2013/08/16 面试题
自我鉴定范文200字
2013/10/02 职场文书
股份合作协议书范本
2014/04/14 职场文书
幼儿园课题方案
2014/06/09 职场文书
工作自我评价范文
2015/03/05 职场文书
导游词之太原天龙山
2020/01/02 职场文书
python之基数排序的实现
2021/07/26 Python
漫画「古见同学有交流障碍症」第25卷封面公开
2022/03/21 日漫