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学习笔记2 函数
Jan 11 Javascript
选择器中含有空格在使用示例及注意事项
Jul 31 Javascript
node.js中的console.time方法使用说明
Dec 09 Javascript
使用Promise解决多层异步调用的简单学习心得
May 17 Javascript
JS实现加载时锁定HTML页面元素的方法
Jun 24 Javascript
利用jQuery+localStorage实现一个简易的计时器示例代码
Dec 25 jQuery
基于vue-ssr的静态网站生成器VuePress 初体验
Apr 17 Javascript
Webstorm2016使用技巧(SVN插件使用)
Oct 29 Javascript
深入浅析vue-cli@3.0 使用及配置说明
May 08 Javascript
express中static中间件的具体使用方法
Oct 17 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
Apr 26 Javascript
微信小程序实现canvas分享朋友圈海报
Jun 21 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
基于pear auth实现登录验证
2010/02/26 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
Joomla调用系统自带编辑器的实现方法
2016/05/05 PHP
laravel-admin 在列表页添加自定义按钮的例子
2019/09/30 PHP
jQuery之自动完成组件的深入解析
2013/06/19 Javascript
查看大图功能代码jquery版
2013/11/05 Javascript
js实现登陆遮罩效果的方法
2015/07/28 Javascript
详解Angular2中的编程对象Observable
2016/09/17 Javascript
React Native实现简单的登录功能(推荐)
2016/09/19 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
nodejs语言实现验证码生成功能的示例代码
2019/10/13 NodeJs
解决小程序无法触发SESSION问题
2020/02/03 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
NestJs使用Mongoose对MongoDB操作的方法
2021/02/22 Javascript
[52:12]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python logging模块学习笔记
2014/05/24 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python实现检测文件MD5值的方法示例
2018/04/11 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Python3.8安装Pygame教程步骤详解
2020/08/14 Python
python对批量WAV音频进行等长分割的方法实现
2020/09/25 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
2021/02/22 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
HTML5 canvas基本绘图之绘制线条
2016/06/27 HTML / CSS
怎样实现H5+CSS3手指滑动切换图片的示例代码
2019/05/05 HTML / CSS
浅析HTML5 Landmark
2020/09/11 HTML / CSS
求职者应聘的自我评价
2013/10/16 职场文书
黄继光的英雄事迹材料
2014/02/13 职场文书
还款承诺书范文
2014/05/20 职场文书
运动会加油稿
2015/07/22 职场文书
赞助商致辞
2015/07/30 职场文书
大学生支教感言
2015/08/01 职场文书
Win11软件图标固定到任务栏
2022/04/19 数码科技