什么是闭包?闭包有什么用?闭包咋写啊?这是一篇介绍js闭包的博客
听说招聘前端程序员的时候,js闭包是个面试官经常问的问题.所以我拿出时间来整理一下:
啥是闭包?
闭包是能读取其他函数内部变量的函数,js中能读取一个函数内部变量的只有该函数的后代函数,在函数的外部是访问不了函数的变量的.
需要操作某个函数的内部变量时,不能把所有的操作都放在函数内部,这样就需要内部函数作为一个桥梁,将函数的信息输送出来
注意一点,在函数内部声明变量时必须要使用var,否则系统会认为你声明的是一个全局变量
声明变量时,如果不写var,系统会认为声明的是window.a,即window对象的属性
闭包有啥用?
1.可以防止全局的命名空间被污染
--如果要写一个累加器,不使用闭包的话,就必须定义一个全局的变量来接收
var count = 0;function add(){count++;console.log(count);} //每次调用add函数count就会加1add();add();add(); //这个函数如果count变量放在函数内部,每次调用函数时count都会被重置为0,不能达到累加的作用 //如果使用闭包就不会出现这一问题
2.便于模块化开发
使用闭包开发的项目各个功能都被封装到了各自的函数中,之间互不影响
3.安全性
将变量都变为私有的,只有通过内部函数才能访问函数的变量,能够提高成程序的安全性
闭包咋写啊?
上面的例子如果写成闭包的形式就是这样:
function add(){var count = 0;function inner(){count++;console.log(count);}return inner; //将内部函数作为返回值返回}var outer = add();//定义一个变量接收add函数的返回值outer();outer();outer(); //在函数外add函数外直接访问count变量是不可能的,但是通过闭包就可以实现
闭包经常与for循环和匿名自调用函数结合:
<!DOCTYPE html> <html> <head><title>模拟一个非诚勿扰的场景</title><script type="text/javascript">window.onload = function(){var btn = document.querySelectorAll('.choiceArea>button');function demo(){for(var i=0;i<btn.length;i++){//每次循环都将i作为一个参数赋值给j (function(j){btn[j].onclick =function(){alert("你的的选择是"+(j+1)+"号女嘉宾");}}(i));};}demo();}</script> </head> <body>请选择你的心动女生:<br /><form class="choiceArea"><button>1号女嘉宾</button><button>2号女嘉宾</button><button>3号女嘉宾</button><button>4号女嘉宾</button><button>5号女嘉宾</button></form> </body> </html>
闭包的缺点
正常函数执行结束之后会立即销毁,而闭包因为存在引用会一直存在在内存中,如果闭包过多就会在内存中占用大量资源,影响程序的性能.
转载于:https://www.cnblogs.com/iszhangk/p/10994965.html
什么是闭包?闭包有什么用?闭包咋写啊?这是一篇介绍js闭包的博客相关推荐
- 勇士斗恶龙:没那么复杂的Js闭包(改)
2019独角兽企业重金招聘Python工程师标准>>> 本文之前发表过一次,虽然当时也是精心书写过,但还是感觉有些问题本说明白,又走上了"把简单的事说复杂"的老毛 ...
- JS闭包的理解及常见应用场景
JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...
- 简单理解js闭包、类型引用....第一章
js 闭包函数.类型引用.this指向.对象原型链...这些东西让我们对js又爱又恨!js虐我千百遍,我待js如初恋. 很多初学者一开始会觉得这些概念没什么用,导致对这些东西产生一种抵抗力.接下来我们 ...
- Java Script Closure(js闭包)-浅谈
链接:https://blog.csdn.net/Tacks/article/details/78704922 本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁.闭包可以用在许多地方.它的最大用 ...
- js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象
js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...
- 用9种办法解决 JS 闭包经典面试题之 for 循环取 i
2017-01-06 Tomson JavaScript 转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明 ...
- js 闭包函数 构造函数_JavaScript中的闭包,库里函数和酷抽象
js 闭包函数 构造函数 In this article, we will talk about closures and curried functions and we'll play aroun ...
- js 闭包作用(转自别人的)
Stone 2012-09-28 15:44 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言 ...
- 详解之-js闭包的用途
js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文 我们来看看闭包的用途.事实上,通 ...
- 面试官:谈谈对JS闭包的理解及常见应用场景(闭包的作用)
文章目录 对JS闭包的理解及常见应用场景(闭包的作用) 1.变量作用域 2.如何从外部读取函数内部的变量? 3.闭包概念 4.闭包用途 5.闭包的理解 6.闭包应用场景 setTimeout传参 回调 ...
最新文章
- Asp.net SignalR 应用并实现群聊功能 开源代码
- 前端学习之html——基本结构
- HDU-3280 Equal Sum Partitions
- runtest的选项应用
- C++(17)--详解const
- 2异常处理_异常是什么?什么是常用类?
- 文本标点符号在前面怎么改_这三个标点符号,为什么写错的人越来越多?
- TurboMail独家提供邮件服务器与Outlook间的地址簿同步插件
- 【人脸识别】VGGFace--基于VGGNet的人脸识别模型
- 【重点】LeetCode 25. Reverse Nodes in k-Group
- 爬虫cookie过期_【Python】Scrapy爬虫框架之Request和Response
- PHP报错:Invalid body indentation level (expecting an indentation level of at least 4)
- nero4j导入关系数据以及节点操作
- React组件化开发
- 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
- 谁先量子计算机谁就,G、IBM、中科院,比一比谁先实现量子计算霸权?
- html css设计页眉页脚,如何使用CSS制作此页眉/内容/页脚布局?
- TCP/IP Attack Lab
- 深圳和广州的培训机构名单(不定期更新)
- 短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离