如何理解闭包

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

 

函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

闭包:定义在函数内部的函数:闭包就是将函数内部与外部链接的桥梁

  1. function f1(){
  2.     var n=999;
  3.     nAdd=function(){n+=1}
  4.     function f2(){
  5.       alert(n);
  6.     }
  7.     return f2;
  8.   }
  9.   var result=f1();
  10.   result(); // 999
  11. nAdd();
  12.   result(); // 1000
上面一个实例就是闭包的使用,证明n并没有被垃圾回收机制所回收。
为什么调用result会出现999的原因在于result是f1的一个实例,result()就相当于f1()();立即执行了f1,而f1返回的是f2函数,最终这句话的意思就是f2();
所以说result()就相当于闭包f2;
同时,nadd作为一个匿名函数被调用也相当于一个闭包
注意!因为闭包会导致垃圾回收机制的失效,所以不要滥用闭包
 
 
  1. var name = "The Window";
  2.   var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.       var that = this;
  6.       return function(){
  7.         return that.name;
  8.       };
  9.     }
  10.   };
  11.   alert(object.getNameFunc()());
  1. var name = "The Window";
  2.   var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.       var that = this;
  6.       return function(){
  7.         return that.name;
  8.       };
  9.     }
  10.   };
  11.   alert(object.getNameFunc()());
贴两个问题,第一个答案是 my object而第二个是the window
原因不贴了,以防下次忘记
posted @ 2017-03-07 16:45  老夫代码复制粘贴  阅读(154)  评论(0)    收藏  举报