javascript的闭包

 闭包的两个特色: javascript


一、做为一个函数变量的一个引用 - 当函数返回时,其处于激活状态。
二、一个闭包就是当一个函数返回时,一个没有释放资源的栈区。

其实上面两点能够合成一点,就是闭包函数返回时,该函数内部变量处于激活状态,函数所在栈区依然保留.

咱们所熟知的主流语言,像C,java等,在函数内部只要执行了return,函数就会返回结果,而后内存中删除该函数所在的区域.生命周期也就中止了.通常的js函数也是这样.
可是有闭包特性的js函数有点特殊.
就例子来讲:
Js代码 复制代码 收藏代码
  1. function a(){
  2. var i=0;
  3. function b(){
  4. alert(++i);
  5. }
  6. return b;
  7. }
  8. var c = a();
  9. 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,而且观察过他的代码,你就会很奇怪他的写法,网上有人也把这种格式叫作闭包. 
相关文章
相关标签/搜索