闭包的两个特色: javascript
function a(){ var i=0; function b(){ alert(++i); } return b; } var c = a(); c();这是个标准的闭包.在函数a中定义了函数b,a又return了b的值.这些能够先无论. var c = a(); c(); 这两句执行很重要. 在var c = a();这行里,执行了a函数,那么确定a通过了return.按照主流语言的函数特性,如今c的值就是a的返回值. 第二行c()的执行实际执行的就是b函数.最后无论执行的是谁,会弹出一个值为0的窗口,到此为止,全部的生命周期按理论来讲就算所有结束了. 但是,若是咱们再多执行一行. var c = a(); c(); c(); 第一次弹出0,第二次执行却弹出了1. 也就是说,第一次c()后,a中的i依然保留.天然a在内存的栈区依然保留. a是return过了,可是,a及内部值却依然存在,这就是闭包. 好了,总结下, 1,闭包外层是个函数. 2,闭包内部都有函数. 3,闭包会return内部函数. 4,闭包返回的函数内部不能有return.(由于这样就真的结束了) 5,执行闭包后,闭包内部变量会存在,而闭包内部函数的内部变量不会存在. 闭包的应用场景(呵呵,复制的参考资料) 一、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而没法经过其余途径访问到,所以保护了i的安全性。---相似于一个实例化的类对象的成员变量和方法。 二、在内存中维持一个变量。依然如前例,因为闭包,函数a中i的一直存在于内存中,所以每次执行c(),都会给i自加1。 根据参考资料的应用场景,咱们会天然的想到java或是c++的类.虽然JS没有类的概念,可是有了类的类似执行结果. 另外,还有一种格式颇受争议: (function(a,b))(a,b); 若是你使用过jquery,而且观察过他的代码,你就会很奇怪他的写法,网上有人也把这种格式叫作闭包.