JS核心知识点梳理——闭包
闭包
闭包这个东西咋说呢,不同的程序员,不同的资料都有不同的解释,你可以把它理解成一个函数,也可以把它理解函数+执行环境。
我们这里不纠结闭包的定义,而是关注闭包的现象,应用,再结合相关面试题去攻克它,最后谈一下我对闭包的理解。
现象
之前说过,函数执行,生成执行环境,函数执行完,销毁执行环境。嗯,听上去很正常,不用的东西就销毁嘛。
但是如果函数执行完,该函数上下文还用怎么办,有用的东西肯定不敢销毁了,这个就是闭包的现象,那么引起这个现象的鄙人就把它理解成闭包!
1 function foo () {
2 var a = 1
3 return function bar () {
4 a++
5 console.log(a)
6 }
7 }
8 var b = foo() //函数执行完,我就问你foo的上下文你敢销毁吗?
9 b() // 2
10 b() // 3
大家看到foo执行完的结果赋值给了b,也就是函数bar赋值给了b,未来我可能让b执行,也就是让bar执行,所以我需要保证让bar能访问上下文不被销毁。bar能访问的上下文实际上是foo执行的上下文。所以foo执行完以后的上下文不会被销毁,会继续存在。
我的理解是 函数向外层作用域暴露出来一个内部引用,那么就存在闭包现象。(真的没有必要纠结闭包到底是啥,是函数?内部整体?)
应用
以下代码的功能是要实现为5个input按钮循环绑定click点击事件,绑定完成后点击1、2、3、4、5五个按钮分别会alert输出0、1、2、3、4五个字符。(腾讯)
请问如下代码是否能实现?
如果不能实现那么现在的效果是什么样的?
应该做怎样的修改才能达到我们想要的效果,并说明原理?
1 <div id="btnBox">
2 <input type="button" value="button_1" />
3 <input type="button" value="button_2" />
4 <input type="button" value="button_3" />
5 <input type="button" value="button_4" />
6 <input type="button" value="button_5" />
7 </div>
8 <script type="text/javascript">
9 var btnBox=document.getElementById('btnBox'),
10 inputs=btnBox.getElementsByTagName('input');
11 var l=inputs.length;
12 for(var i=0;i<l;i++){
13 inputs[i].onclick=function(){
14 alert(i);
15 }
16 }
17 </script>
解决思路1:没有块作用域,我就用es6的let形成块作用域
1 for(let i=0;i<l;i++){
2 inputs[i].onclick=function(){
3 alert(i);
4 }
5 }
解决思路2:每次绑定的时候i其实都是正确的,我能不能用另外一个变量将每次的i存起来呢?
1 //这样行吗?
2 for(var i=0;i<l;i++){
3 inputs[i].onclick=function(){
4 var num = i
5 alert(num);
6 }
7 }
8 //这样还是不行,因为回调函数定义的时候并不会执行,所以当var num = i 执行的时候i已经等于5了
那么我就让回调函数定义的时候里面的代码能立即执行,接收到参数0,1,2,3,4
1 for(var i=0;i<l;i++){
2 inputs[i].onclick=(function(){
3 var num = i
4 alert(num);
5 })(i)
6 }
7 //这样也有问题i传递进去了,但是里面核心代码定义也执行了,我想让它点击的时候再执行
1 for(var i=0;i<l;i++){
2 inputs[i].onclick=(function(){
3 var num = i
4 return function (e) { //注意这个时候e是啥,是点击的事件
5 console.log(num)
6 }
7 })(i)
8 } //这样就没毛病了,返回一个方法,不会立即执行,i传进去了,给了num,由于有闭包,又不会被销毁,完美
JS核心知识点梳理——闭包的更多相关文章
- JS核心知识点:DOM\BOM\EVENT
1.DOM(Document Object Model) :文档对象模型2. DOM节点:页面中最基本的组成部分 3. childNodes:获取某个节点下所有的子节点 在标准及ie9以上 : 会获取 ...
- HTML5学习笔记(十六):原型、类和继承【JS核心知识点】
理解原型 在JavaScript中,只要声明了一个函数,就会为该函数创建一个名为prototype的属性,该属性指向当前函数的原型对象. 而函数的原型对象有一个constructor属性,该属性指向刚 ...
- javascript中的一些核心知识点以及需要注意的地方
前言 近期杂事甚多,这些事情的积累对知识体系的提升有好处,但是却不能整理出来,也整理不出来 比如说我最近研究的Hybrid在线联调方案便过于依赖于业务,就算分享也不会有人读懂,若是抽一点来分享又意义不 ...
- JS重要知识点
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- JS重要知识点(转载 学习中。。。)
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- js基础系列框架:JS重要知识点(转载)
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- Web前端开发--JS技术大梳理
什么是JS JavaScript是一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语 ...
- Javascript重要知识点梳理
Javascript重要知识点梳理 一.Javascript流程控制 js中常用的数据类型 var关键字的使用 if – else if – else switch while for 二.Javas ...
- HTML+CSS+js常见知识点
一.HTML.CSS常见知识点 1.垂直居中盒子 /* 方法一 */ html, body { width: 100%; height: 100%; padding: 0; margin: 0; } ...
随机推荐
- BSOJ6388题解
看上去就很神秘...考虑建出图论模型. 我们将一张牌的两面 \(a,b\) 连一条边. 考虑一个连通块的意义是什么. 边是一张牌,容易发现,如果连通块是一棵树,那么选择一个根节点相当于可以打出除了根节 ...
- Seata XA 模式示例分析
@ 目录 1 下载示例 2 示例结构 3 业务服务 business-xa 3.1 模块结构 3.2 Controller 层 3.3 Service 层 3.4 stock Feign 客户端 3. ...
- k8s原来这么简单(一)核心组件与工作原理
k8s官方文档:https://kubernetes.io/zh/docs/home/ 前提 掌握容器技术:Docker,Containerd等 K8S优势 使用简单,少量人/小团队可以轻松维护大型 ...
- rsync同步文件到远程机器,卡住10多秒--问题解决过程
背景 以前大体介绍过,我们这边是做运维平台的.如果要形象化理解,那么,比如jenkins这种喜闻乐见的软件大致了解吧,jenkins就经常需要同步文件/版本包到远程机器上,jenkins怎么实现的,没 ...
- k8s.gcr.io、gcr.io仓库的镜像下载
镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 获取这类镜像的方法一般有2种: 1.通过拉取国内镜像仓库的内容(操作简单直接拉取即可,缺点是镜像的版本更新可能较慢,可能无法获取最新的镜像) 2 ...
- eclipse中的项目如何打成war包
war包即Web归档文件,将Web项目打成war包可以直接拷贝到Web服务器发布目录(例如Tomcat服务器webapps目录 ),当Tomcat启动后该压缩文件自动解压,war包方便了web工程的发 ...
- Github使用指南(学习中随时更新)
注册好一个账号后先创建一个仓库 点击"Create repository"创建一个版本库 填好带*号的必填项,选择是要公开仓库还是私人使用,勾选自动添加README选项 READM ...
- NLP 自然语言处理实战
前言 自然语言处理 ( Natural Language Processing, NLP) 是计算机科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和 ...
- [使用多仓库解决] idea maven 下载源码出现:Cannot download sources Sources not found for: xxx
根本原因 依赖托管仓库的库存不足.有的仓库,就是没有团队上传这个依赖.所以多加几个镜像源,总有一个仓库能找到. 解决方案 修改 maven 默认配置文件 "C:\Users\<user ...
- sqlserver下载地址及密匙
SqlServer 2017 下载地址及密钥 下载地址: ed2k://|file|cn_sql_server_2017_developer_x64_dvd_11296175.iso|17697771 ...