关于闭包

Posted aizz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于闭包相关的知识,希望对你有一定的参考价值。

全局变量和局部变量

1  var a=1;     //全局变量
2   function fun() {
3     var a=2;    //局部变量
4     b=1;        //全局变量
5     alert(a);   //2
6   }
7   alert(a);     //1
8   alert(b);     //1

 

JS中函数内是可以直接读取全局变量,而函数外部是无法读取函数内的局部变量的

闭包

  闭包就是能读取另一个函数内部变量的函数,可以简单的理解为定义在一个函数内部的函数
  本质上,闭包就是将函数内部和函数外部链接起来的一座桥梁
 1 function f1(){
 2   var n=1;
 3   function f2(){
 4     alert(n);
 5   }
 6   return f2;
 7 }
 8 //alert(n);
 9 var result=f1();
10 result();     //  1

 

js语言的“链式作用域”,子对象会一级一级的向上寻找所有父对象的变量,所以,父对象的所有变量对子对象都是可见的。因为f2可以读取f1中的局部变量,所以只要把f2作为返回值就可以在f1外部读取它的内部变量。

闭包的用途

  1、读取函数内部的变量
  2、让这些变量的值始终保持在内存中
 1 function f1(){
 2   var n=1;
 3   Add=function(){
 4     n+=1;
 5   };
 6   function f2(){
 7     alert(n);
 8   }
 9   return f2;
10 }
11 //alert(n);
12 var result=f1();
13 result();      // 1
14 Add();
15 result(); // 2

  

result实际就是闭包函数f2,一共被执行了两次。第一次是1,第二次是2 。这说明局部变量n一直都在内存里,因为f1是f2的父函数,f2被赋值给一个全局变量,这导致f2始终都在内存中,而f2的存在依赖f1,因此f1也始终都在内存中。

问题

  1、由于闭包会使得函数中的变量都被保存在内存中,内存消耗会很大,所以不能滥用闭包,否则会造成网页的性能问题,在退出函数之前将不使用的局部变量全部删除。
  2、闭包会在父函数外部改变父函数内部变量的值,所以如果把父函数当做对象来使用,把闭包当做它的公用方法,把内部变量当作它的私有属相,这时不能随便改变父函数内变量的值。

以上是关于关于闭包的主要内容,如果未能解决你的问题,请参考以下文章

关于闭包那些事儿

关于闭包

JS---闭包

关于闭包的理解

关于闭包的初级入门

关于js中闭包的理解