浅谈js中的闭包


Posted in Javascript onMarch 16, 2015

首先我们先来看一段代码:

<a href="javascript:void(0);">111</a>

<a href="javascript:void(0);">222</a>

<a href="javacsript:void(0);">333</a>

var a=document.getElementsByTagName("a");
function b(){


for(var i=0;i<a.length;i++){


a[i].onclick=function(){



alert(i);


}


}

}

按照我们设计的初衷,应该是点击一个a标签就相应的弹出该标签的序列号,即点击第一个a就弹出0,点击第二个就弹出1...但是事实是弹出的始终是a标签的个数,这是什么原因呢?这个问题困扰了我很久,查阅了许多网上的资料还有参考书籍,大多说的似是而非,相信也有许多同学对其中原因也不甚了解,就这个问题我谈谈自己的理解,如有不当之处,还请批评指正。

就我个人的理解,上述函数未能达到目的的原因是,事件处理函数绑定了变量i,而该事件处理函数又赋值给了onclick,即是说只有在点击a标签的时候才会调用该函数,因此从逻辑上来说,在单纯的for循环里面function(){alert(i);}这段函数实际上是没有执行的,而当我们点击a标签的时候for循环早就已经执行完毕,此时i的值就是for循环执行完毕的终态值。通俗一点理解,就是这个i的值是属于b函数的,而我们需要的i的值是实时传递进事件处理函数中的值。那么有什么方法可以实现我们的设计初衷呢?聪明的同学可能已经猜到了,那就是使用闭包。

下面我们再来看一段代码:

var a=document.getElementsByTagName("a");
function b(){


for(var i=0;i<a.length;i++){



a[i].onclick=function(j){




return function(){




alert(j);



}


}(i);

}

}

b();

执行以上代码可以发现,我们所要的功能已经实现,即点击任意a标签都会弹出该标签所在的序列号。对上述代码,相信许多同学都看过许多雷同的版本,但是为什么这样做就能实现我们需要的功能了呢,一下是个人的一点浅见,如有不当,还请不吝赐教。

对上述代码的理解,其本质就是对变量i的理解。在这段代码中,函数执行到for循环处发现了一个立即调用函数,这个时候给这个立即调用函数传递实时的i变量值,函数立即调用完成,事件处理函数也就存储了实时的i变量值。

以上所述就是本文的全部内容了,希望对大家理解js闭包能够有所帮助。

Javascript 相关文章推荐
如何用js控制css中的float的代码
Aug 16 Javascript
AJAX使用了UpdatePanel后无法使用alert弹出脚本
Apr 02 Javascript
深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
Mar 05 Javascript
基于JavaScript代码实现pc与手机之间的跳转
Dec 23 Javascript
AngularJS实现textarea记录只能输入规定数量的字符并显示
Apr 26 Javascript
jQuery基本过滤选择器用法示例
Sep 09 Javascript
用JS动态设置CSS样式常见方法小结(推荐)
Nov 10 Javascript
vue通过watch对input做字数限定的方法
Jul 13 Javascript
微信小程序用户自定义模版用法实例分析
Nov 28 Javascript
Vue.directive()的用法和实例详解
Mar 04 Javascript
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 Javascript
vue的for循环使用方法
Feb 12 Javascript
js完美实现@提到好友特效(兼容各大浏览器)
Mar 16 #Javascript
JavaScript DSL 流畅接口(使用链式调用)实例
Mar 15 #Javascript
JavaScript中的DSL元编程介绍
Mar 15 #Javascript
JavaScript中的立即执行函数表达式介绍
Mar 15 #Javascript
Javascript中的arguments与重载介绍
Mar 15 #Javascript
JavaScript中的闭包介绍
Mar 15 #Javascript
Javascript中的匿名函数与封装介绍
Mar 15 #Javascript
You might like
PHP 过滤页面中的BOM(实现代码)
2013/06/29 PHP
php实现的CSS更新类实例
2014/09/22 PHP
关于PHP文件的自动运行方法分析
2016/05/13 PHP
Laravel 实现添加多语言提示信息
2019/10/25 PHP
动态加载JS文件的三种方法
2013/11/08 Javascript
jQuery实现的一个自定义Placeholder属性插件
2014/08/11 Javascript
JS实现自动轮播图效果(自适应屏幕宽度+手机触屏滑动)
2017/06/19 Javascript
详解react服务端渲染(同构)的方法
2017/09/21 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
简单的React SSR服务器渲染实现
2018/12/11 Javascript
ES6 Generator基本使用方法示例
2020/06/06 Javascript
[02:29]大剑、皮鞭、女装,这届DOTA2勇士令状里都有
2020/07/17 DOTA
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
Python合并两个字典的常用方法与效率比较
2015/06/17 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
解决python3爬虫无法显示中文的问题
2018/04/12 Python
Python中pandas模块DataFrame创建方法示例
2018/06/20 Python
Python3 关于pycharm自动导入包快捷设置的方法
2019/01/16 Python
Python爬虫 bilibili视频弹幕提取过程详解
2019/07/31 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
比较基础的php面试题及答案-编程题
2012/10/14 面试题
法雷奥SQA(electric)面试问题
2016/01/23 面试题
行政助理岗位职责
2013/11/10 职场文书
优秀员工自荐书范文
2013/12/08 职场文书
培训演讲稿范文
2014/01/12 职场文书
小学清明节活动方案
2014/03/08 职场文书
好习惯伴我成长演讲稿
2014/05/21 职场文书
大学英语专业求职信
2014/06/21 职场文书
2014副局长群众路线对照检查材料思想汇报
2014/09/22 职场文书
消防验收申请报告
2015/05/15 职场文书
房屋所有权证明
2015/06/19 职场文书
工作简报怎么写
2015/07/21 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript