JavaScript闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】...
一、闭包(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闭包理解【关键字:普通函数、变量访问作用域、闭包、解决获取元素标签索引】...相关推荐
- 闭包:让外部函数能访问函数内的变量,让局部变量长期贮存在内存中
闭包:让外部函数能访问函数内的变量,让局部变量长期贮存在内存中 转载于:https://www.cnblogs.com/xfdmb/p/6126408.html
- python函数作用域包括局部变量和参数_python函数变量的作用域声明(全局变量和局部变量)...
函数变量的作用域声明(全局变量和局部变量) 引入问题: 局部变量: 局部变量:定义在函数内部的变量,它的作用域也仅限于函数内部,出了函数就不能使用了. 例如: #encoding = utf-8 de ...
- php use 使用变量,php闭包中使用use声明变量的作用域实例分析
本文实例讲述了php闭包中使用use声明变量的作用域.分享给大家供大家参考,具体如下: function getClosure($i) { $i = $i.'-'.date('H:i:s'); ret ...
- python作用域的理解-python中对变量的作用域LEGB、闭包、装饰器基本理解
一.作用域 在Python程序中创建.改变.查找变量名时,都是在一个保存变量名的空间中进行,我们称之为命名空间,也被称之为作用域.python的作用域是静态的,在源代码中变量名被赋值的位置决定了该变量 ...
- python函数变量的作用域_学不会的Python函数——变量作用域
1. LEGB函数 Python中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的.我们先来看一段代码. 上述代码有两个变量a,当在test函数中输出变量a的值是,为什么 ...
- 【07】JavaScript:05-作用域、变量的作用域、作用域链、预解析、对象
文章目录 JavaScript基础第05天笔记 1 - 作用域 1.1 作用域概述 1.2 全局作用域 1.3 局部作用域 1.4 JS没有块级作用域 2 - 变量的作用域 3 - 作用域链 4 - ...
- python函数变量的作用域_python函数变量的作用域
python 2.7 变量作用域的疑问 函数a()定义u为全局变量,并赋值为0 函数b()中,设定没有声明u的访问方式 在函数中定义和修改全局变量,需要使用global关键字.但访问全局变量(不修改它 ...
- JavaScript高级程序设计(4)变量、作用域和内存问题
本章内容:理解基本类型和引用类型的值:理解执行环境:理解垃圾收集. 基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值:简单数据段:U ...
- 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型
变量.作用域和内存问题 执行环境共有两种类型--全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中 ...
最新文章
- Android Studio如何用真机调试
- USB基础---OHCI、UHCI、EHCI和XHCI控制器简介
- Ubuntu 18.04搭建Git服务器
- 用C++11 实现 thread pool
- LeetCode 288. 单词的唯一缩写(哈希)
- Spring Cloud Zuul重试机制探秘
- event_base_loop
- 赚钱也好,投资也好,本质上都是一种专业技能
- 一些你可能不知道的 Python 小技巧!
- LeetCode:旋转链表【61】
- [文摘]Java正则表达式详解
- 计算机考研之数据库系统概论
- 16_多易教育之《yiee数据运营系统》用户画像-标签体系设计篇
- vtd和vt的区别_vtvi和v的区别是什么?
- 生活心语--幸福在哪里
- COMPUTER METHODS AND PROGRAMS IN BIOMEDICINE期刊投稿
- 指责TD的人几个是有资格的?--艾瑞网专家项立刚的博客专栏 - 艾瑞网
- Java扫雷游戏心得体会总结_扫雷心得 - stme - BlogJava
- 电力电子技术 学习总结1
- 自己写了一个Asp.net探针的源码,希望大家讨论一下
热门文章
- “PE文件格式”1.9版 完整译文
- mysql保留字-关键字表
- 大数据_Flink_Java版_数据处理_流处理API_Flink中的UDF函数类---Flink工作笔记0036
- AndroidStudio_安卓原生开发_自己设计android端_到springboot端的请求验证Token系统---Android原生开发工作笔记158
- 如何把MySql数据库中的数据导入到MyCat集群中_---Linux运维工作笔记050
- 编程语言_java_面试题0002
- 经典线程同步总结 关键段 事件 互斥量 信号量
- C++查看数据存储大小端模式
- fastadmin 后台view data-source关联报500错误问题
- 安装VMWare tools 及安装后/mnt中有hgfs但没共享文件的解决办法