javascript闭包

 1 function a()
 2 {
 3   var strnum =0;
 4   function b(){
 5       alert(strnum+1);
 6     }
 7  return b;  
 8 }
 9 var result=a();
10   result(); // 1
View Code

这段代码有两个特点:

  1、函数b嵌套在函数a内部;

  2、函数a返回函数b。

使用闭包的注意

1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便。

闭包执行的过程

函数a和b互相引用但又不被外界打扰(被外界引用),函数a和b就会被GC回收。

整个函数a从定义到执行的步骤就完成了。此时a返回函数b的引用给result,又函数b的作用域链包含了对函数a的活动对象的引用,也就是说b可以访问到a中定义的所有变量和函数。函数b被result引用,函数b又依赖函数a,因此函数a在返回后不会被GC回收。

闭包的应用场景

  1、保护函数内的变量安全。以最开始的例子为例,函数a中i只有函数b才能访问,而无法通过其他途径访问到,因此保护了i的安全性。

  2、在内存中维持一个变量。依然如前例,由于闭包,函数a中i的一直存在于内存中,因此每次执行c(),都会给i自加1。

  以上两点是闭包最基本的应用场景,很多经典案例都源于此。

 

摘自《深入理解Javascript闭包

posted on 2014-06-04 15:26  瓶装的生活  阅读(216)  评论(0编辑  收藏  举报