闭包是什么?
闭包的定义:
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
我们来看以下代码,
function foo() { var a = 2; function bar() { console.log(a); } return bar; } var baz = foo(); baz() // 2
bar() 函数本身当作 一个值类型进行传递,显然,bar在自己定义的词法作用域以外的地方执行。
同时,拜闭包所赐,使得foo的内部作用域一直存活,不能被回收,以供bar()在之后的任何时间进行引用。bar()依然持有对该作用域的引用,这个引用就叫做闭包。
在定时器、事件监听器、 Ajax 请求、跨窗口通信、Web Workers 或者任何其他的异步(或者同步)任务中,只要使 用了回调函数,实际上就是在使用闭包!