听说招聘前端程序员的时候,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闭包的博客相关推荐

  1. 勇士斗恶龙:没那么复杂的Js闭包(改)

    2019独角兽企业重金招聘Python工程师标准>>> 本文之前发表过一次,虽然当时也是精心书写过,但还是感觉有些问题本说明白,又走上了"把简单的事说复杂"的老毛 ...

  2. JS闭包的理解及常见应用场景

    JS闭包的理解及常见应用场景 一.总结 一句话总结: 闭包是指有权访问另一个函数作用域中的变量的函数 1.如何从外部读取函数内部的变量,为什么? 闭包:f2可以读取f1中的变量,只要把f2作为返回值, ...

  3. 简单理解js闭包、类型引用....第一章

    js 闭包函数.类型引用.this指向.对象原型链...这些东西让我们对js又爱又恨!js虐我千百遍,我待js如初恋. 很多初学者一开始会觉得这些概念没什么用,导致对这些东西产生一种抵抗力.接下来我们 ...

  4. Java Script Closure(js闭包)-浅谈

    链接:https://blog.csdn.net/Tacks/article/details/78704922 本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁.闭包可以用在许多地方.它的最大用 ...

  5. js 闭包作用域和作用域链_Java:伪造工厂的闭包以创建域对象

    js 闭包作用域和作用域链 最近,我们想创建一个域对象,该对象需要具有外部依赖关系才能进行计算,并且希望能够在测试中解决该依赖关系. 最初,我们只是在领域类中引入依赖关系,但这使得无法在测试中控制其值 ...

  6. 用9种办法解决 JS 闭包经典面试题之 for 循环取 i

    2017-01-06 Tomson JavaScript 转自 https://segmentfault.com/a/1190000003818163 闭包 1.正确的说,应该是指一个闭包域,每当声明 ...

  7. js 闭包函数 构造函数_JavaScript中的闭包,库里函数和酷抽象

    js 闭包函数 构造函数 In this article, we will talk about closures and curried functions and we'll play aroun ...

  8. js 闭包作用(转自别人的)

    Stone 2012-09-28 15:44 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言 ...

  9. 详解之-js闭包的用途

    js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文 我们来看看闭包的用途.事实上,通 ...

  10. 面试官:谈谈对JS闭包的理解及常见应用场景(闭包的作用)

    文章目录 对JS闭包的理解及常见应用场景(闭包的作用) 1.变量作用域 2.如何从外部读取函数内部的变量? 3.闭包概念 4.闭包用途 5.闭包的理解 6.闭包应用场景 setTimeout传参 回调 ...

最新文章

  1. Asp.net SignalR 应用并实现群聊功能 开源代码
  2. 前端学习之html——基本结构
  3. HDU-3280 Equal Sum Partitions
  4. runtest的选项应用
  5. C++(17)--详解const
  6. 2异常处理_异常是什么?什么是常用类?
  7. 文本标点符号在前面怎么改_这三个标点符号,为什么写错的人越来越多?
  8. TurboMail独家提供邮件服务器与Outlook间的地址簿同步插件
  9. 【人脸识别】VGGFace--基于VGGNet的人脸识别模型
  10. 【重点】LeetCode 25. Reverse Nodes in k-Group
  11. 爬虫cookie过期_【Python】Scrapy爬虫框架之Request和Response
  12. PHP报错:Invalid body indentation level (expecting an indentation level of at least 4)
  13. nero4j导入关系数据以及节点操作
  14. React组件化开发
  15. 怎么打开计算机开机启动菜单,计算机怎么添加多系统启动菜单?
  16. 谁先量子计算机谁就,G、IBM、中科院,比一比谁先实现量子计算霸权?
  17. html css设计页眉页脚,如何使用CSS制作此页眉/内容/页脚布局?
  18. TCP/IP Attack Lab
  19. 深圳和广州的培训机构名单(不定期更新)
  20. 短视频社交|电影点播平台Springboot+vue+ElementUI前后端分离

热门文章

  1. Erlang实战练习(一)
  2. linux平台 oracle 数据库 安装文档
  3. 数据整理—dplyr包(filter系列)
  4. MatchingFrontier包简介及R实现
  5. R语言数据可视化---交互式图表recharts包
  6. 数据库表里面加表中的数据
  7. 获取表结构信息(字段名,类型,长度,精度,小数位数,主键,自动增长)...
  8. 控制用户创建课程权限
  9. 自定义服务器控件的元数据属性(MSDN)
  10. JavaScript函数和对象