手机
当前位置:查字典教程网 >编程开发 >Javascript教程 >浅谈js中的闭包
浅谈js中的闭包
摘要:首先我们先来看一段代码:复制代码代码如下:111222333vara=document.getElementsByTagName("a");...

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

复制代码 代码如下:

<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闭包能够有所帮助。

【浅谈js中的闭包】相关文章:

新页面打开实际尺寸的图片

谈一谈javascript闭包

匹配html标记的正则

浅谈javascript事件取消和阻止冒泡

详解JavaScript中的表单验证

关于JS中的闭包浅谈

浅谈angularJS 作用域

如何实现浏览器上的右键菜单

浅谈javascript中的闭包

浅谈javascript的call()、apply()、bind()的用法

精品推荐
分类导航