码迷,mamicode.com
首页 > 其他好文 > 详细

关于闭包

时间:2018-07-07 17:47:25      阅读:111      评论:0      收藏:0      [点我收藏+]

标签:它的   方法   span   闭包函数   退出   网页   fun   否则   function   

全局变量和局部变量

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、闭包会在父函数外部改变父函数内部变量的值,所以如果把父函数当做对象来使用,把闭包当做它的公用方法,把内部变量当作它的私有属相,这时不能随便改变父函数内变量的值。

关于闭包

标签:它的   方法   span   闭包函数   退出   网页   fun   否则   function   

原文地址:https://www.cnblogs.com/aizz/p/9277506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!