一、什么是闭包 

函数可以记住并访问所在词法作用域时,就产生了闭包,即使在词法作用域外调用函数。

(也就是说如果一个函数在执行完之后,其中的内部包含的函数仍然对该函数的作用域持有着引用(函数执行完之后,内存没有被释放,

因为还一直被引用着),那么这个引用就是一个闭包)

二、辨别闭包

1、也就是这样的一个函数也不能算做真正的闭包,对变量a的查找其实只不过是遵循词法作用域找到的。

function foo1() {
var a = 3;
function foo2() {
console.log(a)
}
foo2()
} foo1()

执行函数foo1,将foo1内部的函数引用返回给全局变量foo,foo1执行完,内存没有被回收,因为foo一直引用着foo1中的foo2函数,foo1内存不会被释放。通过foo可以随时访问foo1中的变量。

var a = 4
function foo1() {
var a = 3
function foo2() {
console.log(a)
}
return foo2
}
var a = 5
var foo = foo1() 
foo() //3

  

无论通过何种方式将内部函数的引用传递到所在词法作用域以外再去调用。  

var a = 4
function foo1() {
var a = 3
function foo2() {
console.log(a)
}
bar(foo2)
} function bar(fn) {
var a = 6
fn()
} foo1()

  

2、定时器、事件监听器、Ajax请求、跨窗口通信、web works或任何其他的异步任务中,只要用了回调函数(回调函数执行实质是在当前词法作用域以外的作用域调用的,这也就是为什么回调函数中的this不是指向代码书写的词法作用域的原因),就是在使用闭包。

三、闭包的使用

1、典型案例

每隔1秒打印一个11,创建了10个定时器,每个定时器里面都引用同一个i

for(var i = 1; i<11; i++) {
setTimeout(function(){
console.log(i)
}, 1000*i)
}

  

循环打印数字,打印1到10的数,每隔一秒打印1个数:

for(var i = 1; i<11; i++) {
(function(i) {
setTimeout(function(){
console.log(i)
}, 1000*i)
})(i)
}
for(let i = 1; i<11; i++) {
setTimeout(function(){
console.log(i)
}, 1000*i)
}

2、创建模块  

  

  

最新文章

  1. CPU利用率异常的分析思路和方法交流探讨
  2. JMeter专题系列(一)工具简单介绍
  3. linux安装Mac的默认Monaco字体
  4. IE6兼容性问题及IE6常见bug详细汇总
  5. unity3d 本地数据存储
  6. wpf4 文字 模糊 不清晰 解决方法
  7. C语言之 短路原则
  8. Android之TextView的样式类Span的使用具体解释
  9. Android空指针异常的常见情况
  10. 学习了解CyclicBarrier
  11. eclipse中使用Lombok(转)
  12. Mysql笔试题(二)
  13. qnx gpio
  14. rabbitmq management advance lesson
  15. Python库,让你相见恨晚的第三方库
  16. IntelliJ IDEA 2017版 编译器使用学习笔记(七) (图文详尽版);IDE快捷键使用;IDE代码重构(编写高质量代码)
  17. 使用cssQuery选择器语法来查找元素
  18. 2018.08.22 NOIP模拟 string(模拟)
  19. .Net程序猿玩转Android开发---(11)页面跳转
  20. idea使用插件activate-power-mode给编码加上特效和带来乐趣。

热门文章

  1. sgu 125 Shtirlits dfs 难度:0
  2. hdu 3072 Intelligence System(Tarjan 求连通块间最小值)
  3. CentOS 7 Crontab
  4. BitDefender(比特梵德)特惠活动 免费获取9个月激活码
  5. ReentrantLock的原理解析
  6. 0121 集合类 ArrayList 的练习
  7. java爬虫爬取的html内容中空格(&amp;nbsp;)变为问号“?”的解决方法
  8. 强化学习 CartPole实验的一些启发 有没有可能设计一个新的实验呢?(杆子可以向360度方向倾倒,可行吗?)
  9. caffe安装编译问题-ImportError: libopencv_core.so.3.4: cannot open shared object file: No such file or directory
  10. [LeetCode&amp;Python] Problem 136. Single Number