JS闭包经典实例详解


Posted in Javascript onDecember 20, 2018

本文实例讲述了JS闭包。分享给大家供大家参考,具体如下:

之前花了很多时间看书上对闭包的介绍,也看了很多人的写的关于闭包的博客,然后我就以为自己懂了。

结果,下午在一个QQ群里,有人问了这道经典的闭包问题,如下图:

JS闭包经典实例详解

我告诉他去看书上的闭包介绍。告诉他之后,我想我自己要不也写一下,反正花不了多少时间,结果花了好久怎么写也不对..............

后来看了看书上的,然后自己总结了下,觉得这次应该懂了。下次还不理解我就可以去跳楼了............

-----------------------------------分割线-----------------------------------分割线--------------------------

首先我们来了解几个概念:

立即执行函数:形如 (function(){})();的一类函数;

闭包:闭包是指有权访问另一函数作用域中的变量的函数。

作用域链:当代码执行的时候,会创建变量对象的一个作用域链....(具体百度)

我们再来看这个问题,我重新写了一个,源码如下:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>闭包经典例子详解——huansky</title>
</head>
<body>
  <div id="ttt">
    <p >000000000000000000</p>
      <br>
    <p >111111111111111111</p>
    <br>
    <p >222222222222222222</p>
  </div>
</body>
<script>
var dom=document.getElementsByTagName("p");
for(var i=0;i<dom.length;i++){
    dom[i].onclick=function(){
      console.log(i);//3
    };
}
</script>
</html>

首先,代码中的匿名函数没有变量 i,所以它必须向上查找,在全局环境中找到了 i。

for循环运行后,全局变量中的 i 变成了3。此时当你点击文字的时候,会调用其绑定的函数,而该函数运行的时候,发现自己没有 i,就会取得全局环境中的 i。

所以,最后的结果是,不管你点击那段文字,最后结果都是3。

PS:感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,看看运行效果。

那怎么办呢?你可以用立即执行函数,看代码:

for(var i=0;i<dom.length;i++){
    dom[i].onclick=function(i){
      return function( ){
      console.log(i);
      };
    }(i);
}

我们把参数 i 作为传给立即执行函数,这样,i 的值就传给了立即执行函数的局部变量 i 了。立即执行函数会直接执行,但是其活动不会销毁,因为里面有个匿名函数。执行后局部变量 i 与全局变量 i 联系就切断了,也就是执行的时候,传进去的变量 i 是多少,立即执行函数的局部变量 i  就是多少,并且该局部变量 i 仍然没有消失,因为匿名函数的存在。

这时候,return中的匿名函数的作用域链中会有两个变量 i。当点击文本的时候,它向上搜索 i 的时候,它找到立即执行函数的局部变量 i ,就停止向上查找了,因此最后的结果就不会是全局变量 i 的值3了。

有一个方法可以检验你们有没有真的理解上面所说的,看上面的变体,代码:

for(var i=0;i<dom.length;i++){
    dom[i].onclick=function(t){
      return function( ){
      console.log(t);//1
      console.log(i);//3
      };
    }(i);
}

其实return中的匿名函数中的 t 就是立即执行函数的局部变量 i,而 i 就是 指全局变量 i,因为立即执行函数中没有变量i,只能继续向上搜索,然后就找到全局变量的 i 了。

如果看到这里,你还没有理解,有两个原因:一个原因是我表达的不够好,另一个原因是你没有完全理解前面提到的这些概念,还要继续看书。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
用javascript实现页面打印的三种方法
Mar 05 Javascript
jQuery TextBox自动完成条
Jul 22 Javascript
JS实现div内部的文字或图片自动循环滚动代码
Apr 19 Javascript
jQuery中bind,live,delegate与one方法的用法及区别解析
Dec 30 Javascript
jquery的trigger和triggerHandler的区别示例介绍
Apr 20 Javascript
jQuery使用append在html元素后同时添加多项内容的方法
Mar 26 Javascript
javascript实现实时输出当前的时间
Apr 27 Javascript
AngularJS 指令详细介绍
Jul 27 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
javascript编程实现栈的方法详解【经典数据结构】
Apr 11 Javascript
React Navigation 使用中遇到的问题小结
May 08 Javascript
ant design 日期格式化的实现
Oct 27 Javascript
JS闭包原理与应用经典示例
Dec 20 #Javascript
Mint UI组件库CheckList使用及踩坑总结
Dec 20 #Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 #Javascript
微信小程序实现swiper切换卡内嵌滚动条不显示的方法示例
Dec 20 #Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 #Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
Dec 20 #Javascript
微信小程序module.exports模块化操作实例浅析
Dec 20 #Javascript
You might like
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
PHP重定向与伪静态区别
2017/02/19 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
解决jquery .ajax 在IE下卡死问题的解决方法
2009/10/26 Javascript
Document对象内容集合(比较全)
2010/09/06 Javascript
HTML DOM的nodeType值介绍
2011/03/31 Javascript
iframe 上下滚动条如何默认在下方实现原理
2012/12/10 Javascript
jquery动态加载js/css文件方法(自写小函数)
2014/10/11 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
JavaScript设计模式之建造者模式介绍
2014/12/28 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
jquery之别踩白块游戏的简单实现
2016/07/25 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
JS实现普通轮播图特效
2020/01/01 Javascript
Js实现复选框的全选、全不选反选功能代码实例
2020/02/28 Javascript
微信小程序调用后台service教程详解
2020/11/06 Javascript
JavaScript 实现拖拽效果组件功能(兼容移动端)
2020/11/11 Javascript
python中reader的next用法
2018/07/24 Python
pytorch自定义初始化权重的方法
2019/08/17 Python
python如何使用腾讯云发送短信
2020/09/17 Python
如何在pycharm中安装第三方包
2020/10/27 Python
Foot Locker意大利官网:全球领先的运动鞋和服装零售商
2017/05/30 全球购物
美国最大的万圣节服装网站:HalloweenCostumes.com
2017/10/12 全球购物
演讲稿的写法
2014/05/19 职场文书
安全责任书怎么写
2014/07/28 职场文书
教师批评与自我批评
2014/10/15 职场文书
表扬稿格式范文
2015/01/16 职场文书
python基础之爬虫入门
2021/05/10 Python
Matlab如何实现矩阵复制扩充
2021/06/02 Python
使用python绘制横竖条形图
2022/04/21 Python
MySQL中EXPLAIN语句及用法
2022/05/20 MySQL