一、什么是闭包
- 在MDN中闭包的定义为:闭包是函数和声明该函数的词法环境的组合。
- 在《你不知道的JavaScript上卷》中讲解相关闭包部分有一句话我特别喜欢:“JavaScript闭包无处不在。你只需要之别并拥抱它”。在本书中的定义为:当函数可以记住并访问所在的词法作用域,即函数是在当前词法作用域之外执行,这时就产生了闭包。
二、实践出真知
function foo () { var a = 2; function bar() { console.log(a); } return bar; } var baz = foo(); //相当于内部的bar函数 baz(); // 2 // foo执行后,foo()的内部作用域不会被销毁。 function foo () { var a = 2; function bar() { console.log(a); } baz(bar); } function baz(fn) { fn(); // 相当于foo函数内部的bar函数 }
无论通过任何手段将内部函数传递到所在的词法作用域意外,都会对持有原始定义作用域的引用,无论在何处执行这个函数都会使用闭包。 在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers或者任何其它的异步或者同步任务中,只要使用了回调函数,实际上就是在使用闭包。
三、循环中的闭包
for (var i=0; i<=5; i++) { setTimeout(function timer() { console.log(i); }, i*1000) } for (var i=0; i<=5; i++) { (function(j) { setTimeout(function timer() { console.log(j); }, i*1000) })(i); }
四、闭包的用途
对闭包有了基本的了解,但是对于实际应用在项目中如何选择,何时使用还是不能做出很好的判断,后续更新...
在我的博文中,恰好有一个循环闭包的例子(动态生成表格的每一行的操作按钮如何获取当前行的index):http://www.cnblogs.com/cxuer/p/7521960.html