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中匿名函数,函数直接量和闭包
May 08 Javascript
node.js中watch机制详解
Nov 17 Javascript
流量统计器如何鉴别C#:WebBrowser中伪造referer
Jan 07 Javascript
jquery手风琴特效插件
Feb 04 Javascript
js实现选中页面文字将其分享到新浪微博
Nov 05 Javascript
总结JavaScript三种数据存储方式之间的区别
May 03 Javascript
JavaScript生成验证码并实现验证功能
Sep 24 Javascript
基于jQuery的checkbox全选问题分析
Nov 18 Javascript
分享19个JavaScript 有用的简写写法
Jul 07 Javascript
vue设置动态请求地址的例子
Nov 01 Javascript
Vue如何基于es6导入外部js文件
May 15 Javascript
Jquery $.map使用方法实例详解
Sep 01 jQuery
纯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
基于文本的搜索
2006/10/09 PHP
Email+URL的判断和自动转换函数
2006/10/09 PHP
php email邮箱正则
2008/10/08 PHP
php简单提示框alert封装函数
2010/08/08 PHP
利用curl抓取远程页面内容的示例代码
2013/07/23 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
Symfony的安装和配置方法
2016/03/17 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
浅谈关于PHP解决图片无损压缩的问题
2017/09/01 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
PHP count()函数讲解
2019/02/03 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
PHP中迭代器的简单实现及Yii框架中的迭代器实现方法示例
2020/04/26 PHP
基于ThinkPHP删除目录及目录文件函数
2020/10/28 PHP
qTip2 精致的基于jQuery提示信息插件
2012/02/17 Javascript
JavaScript实现快速排序(自已编写)
2012/12/19 Javascript
基于jQuery实现的菜单切换效果
2015/10/16 Javascript
jQuery实现下拉菜单的实例代码
2017/06/19 jQuery
react+redux仿微信聊天界面
2019/06/21 Javascript
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python编程生成随机用户名及密码的方法示例
2017/05/05 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
Python 一键制作微信好友图片墙的方法
2019/05/16 Python
解决Django 在ForeignKey中出现 non-nullable field错误的问题
2019/08/06 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
美国休闲服装品牌:Express
2016/09/24 全球购物
妇科医生自荐信
2013/11/05 职场文书
协议书模板
2014/04/23 职场文书
舞蹈教育学专业自荐信
2014/06/15 职场文书
节能减耗标语
2014/06/21 职场文书
咖啡店创业计划书
2014/08/15 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
2015年三年级班主任工作总结
2015/05/21 职场文书
2019年最新感恩节祝福语(28句)
2019/11/27 职场文书