欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

关于闭包

程序员文章站 2022-12-19 20:52:19
全局变量和局部变量 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  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、闭包会在父函数外部改变父函数内部变量的值,所以如果把父函数当做对象来使用,把闭包当做它的公用方法,把内部变量当作它的私有属相,这时不能随便改变父函数内变量的值。