闭包:
当函数可以记住并访问所在的词法作用域时,就产生了闭包,即使函数是在当前词法作用域之外执行。
show code to you!!!
在foo()执行后,通常会期待引擎的垃圾回收器释放掉不再使用的内存空间,销毁foo() 的整个内部作用域。而闭包的“神奇”之处正是可以阻止这件事情的发生。事实上内部作用域依然存在,并没有被回收。bar()本身在使用这个内部作用域;bar() 依然持有对该作用域的引用,这个引用就叫作闭包。
无论使用何种方式对函数类型的值进行传递,当函数在别处被调用时都可以观察到闭包。
show code to you again!!!
本质上无论何时何地,如果将函数(访问它们各自的词法作用域)当作第一级的值类型并到处传递,你就会看到闭包在这些函数中的应用。在定时器、事件监听器、Ajax请求、跨窗口通信、Web Workers或者任何其他的异步(或者同步)任务中,只要使用了回调函数,实际上就是在使用闭包!
tip1:延迟函数的回调会在循环结束时才执行。
如果作用域是空的,那么仅仅将它们进行封闭是不够的。IIFE需要包含一点实质内容才能为我们所用。【根据闭包的定义】