js闭包引起的事件注册问题介绍


Posted in Javascript onMarch 29, 2016

背景:闲暇时间看了几篇关于js作用域链与闭包的文章,偶然又看到了之前遇到的一个问题,就是在for循环中为dom节点注册事件驱动,具体见下面代码:

<!DOCTYPE html>
<html>
  <head>
    <title>js闭包</title>
    <meta charset="utf-8" />
  </head>
  <body>
    <button id="anchor1">1</button>
    <button id="anchor2">2</button>
    <button id="anchor3">3</button>
    <script type="text/javascript" src="jquery-1.12.1.js"></script>
    <script type="text/javascript">
      function pageLoad(){
        for (var i = 1; i <=3; i++) { 
          var anchor = document.getElementById("anchor" + i);
          anchor.onclick = function () {
            console.log("anchor"+i);
          } 
        } 
      } 
      window.onload = pageLoad; 
    </script>
  </body>
</html>

按照正常的想法,结果应该是点击3个按钮分别提示“anchor1”、“anchor2”、“anchor3”;期初我也是这么认为的,但是结果却是不管点击哪个按钮,都会提示“anchor4”。

这是为什么呢?不要着急,待我们慢慢分析,这里面包含js作用域链与闭包的知识,在这里我就不详细介绍了。

首先我们看这个anchor.onclick,这是什么?这是dom0级事件处理程序啊,废话,我也知道,博主是蛇精病吗*************不要吵了,我想说的是这个anchor.onclick

是一个事件处理程序的声明,就像var name="小明"一样,这是声明了,但是还没有执行,这就是关键,我们将上面的js代码修改一下再来看看:

function pageLoad(){
     for (var i = 1; i <=3; i++) { 
       var anchor = document.getElementById("anchor" + i);
         anchor.onclick = function () {
            console.log("anchor"+i);
         } 
         if(i==2){
           debugger;//我们在这里debugger一下,然后在控制台手动触发#anchor1和#anchor2的点击事件
         }
     } 
 } 
 window.onload = pageLoad;

js闭包引起的事件注册问题介绍

看到了吧,我们通过debugger让循环在i==2时停止,然后又去控制台手动触发#anchor1和#anchor2的点击事件,结果控制台打印“anchor2”。

整个的逻辑大致是这样的:anchor.onclick一直保存着i的引用,i在循环中是一直变化的,从i=1到i=4;虽然在循环的过程中,anchor.onclick曾经保存过(注意“曾经”两字),

1,2,3这三种情况,但是i最终变成了4,所以说,无论点击哪个按钮,都会输出“anchor4”

结语:js中作用域链与闭包的知识很重要,虽然在此没有讲,其实是害怕讲不明白,反而误导了大家

以上这篇js闭包引起的事件注册问题介绍就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
extjs grid取到数据而不显示的解决
Dec 29 Javascript
在网页里看flash的trace数据的js类
Jan 10 Javascript
jQuery根据元素值删除数组元素的方法
Jun 24 Javascript
详解微信小程序开发之下拉刷新 上拉加载
Nov 24 Javascript
es7学习教程之Decorators(修饰器)详解
Jul 21 Javascript
js判断输入框不能为空格或null值的实现方法
Mar 02 Javascript
Angular @HostBinding()和@HostListener()用法
Mar 05 Javascript
layer弹出层 iframe层去掉滚动条的实例代码
Aug 17 Javascript
layui.tree组件的使用以及搜索节点功能的实现
Sep 26 Javascript
javascript将扁平的数据转为树形结构的高效率算法
Feb 27 Javascript
Vue数据双向绑定原理实例解析
May 15 Javascript
微信小程序之导航滑块视图容器功能的实现代码(简单两步)
Jun 19 Javascript
使用postMesssage()实现跨域iframe页面间的信息传递方法
Mar 29 #Javascript
js滚动条平滑移动示例代码
Mar 29 #Javascript
JavaScript头像上传插件源码分享
Mar 29 #Javascript
js解决movebox移动问题
Mar 29 #Javascript
javascript中不易分清的slice,splice和split三个函数
Mar 29 #Javascript
分析js闭包引起的事件注册问题
Mar 29 #Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 #Javascript
You might like
thinkPHP删除前弹出确认框的简单实现方法
2016/05/16 PHP
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
JS简单实现文件上传实例代码(无需插件)
2013/11/15 Javascript
一个小例子解释如何来阻止Jquery事件冒泡
2014/07/17 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript返回网页中超链接数量的方法
2015/04/03 Javascript
JavaScript实现点击按钮直接打印
2016/01/06 Javascript
JavaScript常用本地对象小结
2016/03/28 Javascript
jQuery remove()过滤被删除的元素(推荐)
2017/07/18 jQuery
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
基于Axios 常用的请求方法别名(详解)
2018/03/13 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
使用JQuery自动完成插件Auto Complete详解
2019/06/18 jQuery
vue实现简单图片上传
2020/06/30 Javascript
python使用rabbitmq实现网络爬虫示例
2014/02/20 Python
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
2014/06/25 Python
Python应用03 使用PyQT制作视频播放器实例
2016/12/07 Python
使用Python绘制图表大全总结
2017/02/11 Python
Python冲顶大会 快来答题!
2018/01/17 Python
对pandas replace函数的使用方法小结
2018/05/18 Python
PyQt5的安装配置过程,将ui文件转为py文件后显示窗口的实例
2019/06/19 Python
在pycharm中为项目导入anacodna环境的操作方法
2020/02/12 Python
快速解决jupyter notebook启动需要密码的问题
2020/04/21 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
太阳镜仓库,售价20美元或更少:Sunglass Warehouse
2016/09/28 全球购物
英国领先的豪华时尚家居网上商店:Amara
2019/08/12 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
善意的谎言事例
2014/02/15 职场文书
销售团队口号大全
2014/06/06 职场文书
村官2015年度工作总结
2015/10/14 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
创业的9条正确思考方式
2019/08/26 职场文书
聘任书的格式及模板
2019/10/28 职场文书