JavaScript利用闭包循环绑定事件

  

我们经常在做前端面试题的时候,会遇到循环绑定事件后,输出打印结果,很多人总是搞不清楚,今天借此机会跟大家梳理一下闭包相关作用。

1.首先我们举一个简单的例子。

html部分:

<a href="#">首页</a>
<a href="#">作品</a>
<a href="#">文章</a>
<a href="#">工具</a>
<a href="#">招聘</a>
<a href="#">赛事</a>
<a href="#">更多</a>

js部分:

var a = document.getElementsByTagName("a");
for(var i =0; i<a.length; i++){
   a[i].onclick = function(){
        alert(i);
   }
}

现在如果点击“首页”链接,大家认为会弹出什么数字? 答案是7,因为循环绑定以后,i最终为7,所以打印出来的结果就是 7

2.下面我们使用闭包进行封装一次。

var a = document.getElementsByTagName("a");
for(var i =0; i<a.length; i++){
   a[i].onclick = (function(i){
        return function(){alert(i);}
   })(i);
}

此时,再次进行测试,点击超链接以后,弹出对应的索引值,这就是闭包的作用之一,闭包引用外部变量后,暂时不会被系统回收,onclick后面的代码即为:立即执行一个函数,并且将i变量传递进去,执行函数的时候,内部返回了一个函数,同时,返回的函数内部会引用该参数,因而锁定了此变量。当年点击某一个a链接时,就会执行此return 后面的函数,弹出对应的结果。

闭包简单的说,就是方法里面套方法,最终形成闭包,那么经过我个人的总结经验,闭包的作用主要有:

A:使用闭包可以访问某函数的局部变量,同时这些变量都一直存在于内存中。例如:

function func1(){
  var n=999;
}

alert(n); // error

使用闭包后:

function func1(){

  var n=999;//局部变量,外部函数无法访问

  function func2(){
    alert(n); 
  }

  return func2;//返回内部函数

}

var result=func1();

result(); // 999

此时,可借助于闭包访问f1函数的内部变量n,这就是闭包的功效之一,可以访问某函数的局部变量。

B:防止空间污染。闭包中的变量不会被外界访问,因而,内部和外部是隔断的,从而减少变量重复带来的困惑。

闭包的不好之处:

如果闭包引用外部变量,则此变量会一直存在于内存当中,从而降低性能,这也就是为什么,使用闭包循环绑定事件后,点击会弹出对应数字的效果了。

另外,很多Jquery插件再开发的过程中,都会使用闭包,如下:

(function($){
    //to-do ...})(jQuery);这种写法,就很好的保护了空间变量,不会污染到外面的对象,所有的操作都在闭包内部执行。

以上只是个人前端对于闭包的经验之谈,每个人理解的可能不一样,有不对的地方,可指出来,我加以修正,谢谢。
时间: 2024-10-10 13:15:01

JavaScript利用闭包循环绑定事件的相关文章

js循环绑定事件

在js中,用循环来为一对元素队列的元素绑定事件,是一个常见的问题. 通常进入误区的新人,都会这么写代码: (假设元素队列为o,默认使用jQuery) //error method var o =$('.blockHead'); for(var i=0; i<o.length; i++){ o[i].onclick = function(){ function(i){ alert(i); } } } 当然这种情况下,你会发现每个元素点击运行时,显示的 i值 都是 o.length-1: 因为js的

JavaScript利用闭包解决循环绑定事件

例子: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <button></button> <button></button> <button></button> </body> <script type="text/javasc

javascript:使用代理绑定事件

<ul id="box"> <li>1</li> <li>2</li> <li>3</li> <li>4</li> </ul> 普通情况下:通过循环绑定所有 var li=document.getElementsByTagName("li"); for(var i=0;i<li.length;i++){ li[i].addEventListe

遇到的问题(JS循环绑定事件)

问题描述:想通过循环的方式给HTML元素绑定事件,结果失败---总是会只能绑定到最后一个元素. HTML <div id="bnts"> <span></span> <span></span> <span></span> <span></span> </div> JS var bnts = document.getElementById("bnts"

JavaScript案列001 for循环绑定事件

场景-错误写法 解决方法一 : 解决方案二: 解决方案三: 原文地址:https://www.cnblogs.com/anduyinglufei/p/10352692.html

js循环绑定事件解决方案

var add_the_handlers = function (nodes) { var helper= function (i) {return function (e) {alert(i);};}; var i; for (i = 0; i < nodes.length; i += 1) { nodes[i].onclick =helper(i); }};

给html元素循环绑定事件

/** * 添加点击的样式 */ function addClickClass(){ var eles = ["a.province",".citys"]; var classes = ["hover","hover2"]; for (var i = 0; i < eles.length; i++) { var obj = new addClickClass_(i,eles,classes); $(eles[i]).bi

javascript 循环遍历绑定事件问题

<!DOCTYPE html> <html manifest="/browser_page_mng/html/4/1000266/cache.manifest"> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <meta charset="utf-8"> <t

JavaScript中闭包实现的私有属性的getter()和setter()方法

注意: 以下的输出都在浏览器的控制台中 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>闭包</title> </head> <body> <script type="text/javascript"> /** * 利用闭包实现 * 这个函数给对象o增加了属性存储器方法 * 方法名称为ge