一、闭包(Closure)模糊概述 

  之前总觉得闭包(Closure)很抽象而且难理解,百度一下"闭包"名词,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。看了半天,也没有看懂闭包是什么?以下将是我对闭包(Closure)的理解,如有错误欢迎指出

 二、普通函数、变量访问作用域

  

以上普通函数的调用fn被调用了两次,变量b却没有累加??

对于函数f1变量b在函数外部是不能访问的

如若实现局部变量b的累加,并且可以访问该怎么做呢?

 三、闭包(Closure)的清晰描述

  (1)闭包(Closure)简单的可以理解成函数的嵌套,闭包就是能够读取其他函数内部变量的函数。

  (2)变量长期驻留在内存中

  

  

  以上可以看出,父函数f1中的变量b对于子函数f2是可访问的或者说是可见的,父函数f1调用一次,意味着变量b始终都是同一变量,f2中的b++,实现了对同一变量的自加,

对于子函数f2形成一个最简单的闭包(或者说函数f2维持着对外部作用域f1的引用,因此总可以访问f1作用域中的变量b)

三、闭包在对象中应用

  

  

四、解决获取标签索引问题

  需求:当点击点击标签li时,获取标签li的内容及索引

  

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>未使用闭包获取标签索引</title><script type="text/javascript">window.onload=function(){var oLi=document.getElementsByTagName('li');for (var i = 0; i < oLi.length; i++) {oLi[i].onclick=function(){//当点击li的时候,for循环已经执行完毕alert(this.innerHTML+'index'+i);//总是i==5
                }};}</script>
</head>
<body><ul><li>AAA</li><li>BBB</li><li>CCC</li><li>DDD</li><li>EEE</li></ul>
</body>
</html>

b.解决方案二<使用闭包>代码如下:

 

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>闭包解决获取标签索引问题</title><script type="text/javascript">window.onload=function(){var oLi=document.getElementsByTagName('li');/*for (var i = 0; i < oLi.length; i++) {oLi[i].οnclick=(function(i){ //就已经存储到缓冲中return function(){alert(this.innerHTML+'index'+i);}})(i)};*/for (var i = 0; i < oLi.length; i++) {(function(i){oLi[i].onclick=function(){alert(this.innerHTML+'index'+i);}})(i)};}</script>
</head>
<body><ul><li>AAA</li><li>BBB</li><li>CCC</li><li>DDD</li><li>EEE</li></ul>
</body>
</html>

五、一道思考题(for循环与setTimeout)

  

  上述打印结果打印了10次10,而不是0~9

    原因 当 console.log 被调用的时候,匿名函数保持对外部变量 i 的引用,此时 for循环已经结束, i 的值被修改成了 10.

  为了打印结果是0~9,需要在每次循环时创建变量i的拷贝修改代码如下

  

转载于:https://www.cnblogs.com/yuerdong/p/7840115.html

JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】...相关推荐

  1. 闭包:让外部函数能访问函数内的变量,让局部变量长期贮存在内存中

    闭包:让外部函数能访问函数内的变量,让局部变量长期贮存在内存中 转载于:https://www.cnblogs.com/xfdmb/p/6126408.html

  2. python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...

    函数变量的作用域声明(全局变量和局部变量) 引入问题: 局部变量: 局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了. 例如: #encoding = utf-8 de ...

  3. php use 使用变量,php闭包中使用use声明变量的作用域实例分析

    本文实例讲述了php闭包中使用use声明变量的作用域.分享给大家供大家参考,具体如下: function getClosure($i) { $i = $i.'-'.date('H:i:s'); ret ...

  4. python作用域的理解-python中对变量的作用域LEGB、闭包、装饰器基本理解

    一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...

  5. python函数变量的作用域_学不会的Python函数——变量作用域

    1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...

  6. 【07】JavaScript:05-作用域、变量的作用域、作用域链、预解析、对象

    文章目录 JavaScript基础第05天笔记 1 - 作用域 1.1 作用域概述 1.2 全局作用域 1.3 局部作用域 1.4 JS没有块级作用域 2 - 变量的作用域 3 - 作用域链 4 - ...

  7. python函数变量的作用域_python函数变量的作用域

    python 2.7 变量作用域的疑问 函数a()定义u为全局变量,并赋值为0 函数b()中,设定没有声明u的访问方式 在函数中定义和修改全局变量,需要使用global关键字.但访问全局变量(不修改它 ...

  8. JavaScript高级程序设计(4)变量、作用域和内存问题

    本章内容:理解基本类型和引用类型的值:理解执行环境:理解垃圾收集.  基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值:简单数据段:U ...

  9. 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型

    变量.作用域和内存问题 执行环境共有两种类型--全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中 ...

最新文章

  1. Android Studio如何用真机调试
  2. USB基础---OHCI、UHCI、EHCI和XHCI控制器简介
  3. Ubuntu 18.04搭建Git服务器
  4. 用C++11 实现 thread pool
  5. LeetCode 288. 单词的唯一缩写(哈希)
  6. Spring Cloud Zuul重试机制探秘
  7. event_base_loop
  8. 赚钱也好,投资也好,本质上都是一种专业技能
  9. 一些你可能不知道的 Python 小技巧!
  10. LeetCode:旋转链表【61】
  11. [文摘]Java正则表达式详解
  12. 计算机考研之数据库系统概论
  13. 16_多易教育之《yiee数据运营系统》用户画像-标签体系设计篇
  14. vtd和vt的区别_vtvi和v的区别是什么?
  15. 生活心语--幸福在哪里
  16. COMPUTER METHODS AND PROGRAMS IN BIOMEDICINE期刊投稿
  17. 指责TD的人几个是有资格的?--艾瑞网专家项立刚的博客专栏 - 艾瑞网
  18. Java扫雷游戏心得体会总结_扫雷心得 - stme - BlogJava
  19. 电力电子技术 学习总结1
  20. 自己写了一个Asp.net探针的源码,希望大家讨论一下

热门文章

  1. “PE文件格式”1.9版 完整译文
  2. mysql保留字-关键字表
  3. 大数据_Flink_Java版_数据处理_流处理API_Flink中的UDF函数类---Flink工作笔记0036
  4. AndroidStudio_安卓原生开发_自己设计android端_到springboot端的请求验证Token系统---Android原生开发工作笔记158
  5. 如何把MySql数据库中的数据导入到MyCat集群中_---Linux运维工作笔记050
  6. 编程语言_java_面试题0002
  7. 经典线程同步总结 关键段 事件 互斥量 信号量
  8. C++查看数据存储大小端模式
  9. fastadmin 后台view data-source关联报500错误问题
  10. 安装VMWare tools 及安装后/mnt中有hgfs但没共享文件的解决办法