闭包

代码开发的格式 - 注意冲突和依赖

作用域:

任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。
局部作用域和全局作用域
在JavaScript中,变量的作用域有全局作用域和局部作用域两种
全局作用域(变量):整个程序都有效,即整个代码中都可以调用(变量前面没有添加var变成全局的属性)
局部作用域(变量):只对函数内部有效,即只能在本变量声明的函数内部调用。

 var a =1;//全局
       function fn(){//函数是半透明的,里面看到外面,外面看不到里面。
           var b=2;//局部
           c=3;//没有var,变成全局的属性
           alert(a);//1
       }
       fn();
       alert(a);//1
       alert(c);//3
       alert(b);//报错 b is not define 

作用域链

通俗地讲,当声明一个函数时,局部作用域一级一级向上包起来,就是作用域链。

当执行函数时,总是先从函数内部找寻局部变量如果内部找不到(函数的局部作用域没有),则会向创建函

数的作用域(声明函数的作用域)寻找,依次向上查找。

在函数体内,局部变量的优先级高于同名的全局变量-作用域链

var num =1;
      function a(){
          var num =2;
          function b(){
              var num =3;
              function c(){
                  var num =4;
                  alert(num);
              }
              c()
          }
          b()
      }
      a(); 

作用域控制着变量与函数的可见性和生命周期。
全局变量:生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量。(浏览器垃圾回收机制)
局部变量:函数内用 var 关键字声明的局部变量,当退出函数时,它们都会随着函数调用的结束而被销毁。

垃圾回收方式–浏览器
标记清除(mark and sweep)、引用计数(reference counting)。
1 标记清除
大部分浏览器以此方式进行垃圾回收,当变量进入执行环境(函数中声明变量)的时候,垃圾回收器将其标记为“进入环境”,当变量离开环境的时候(函数执行结束)将其标记为“离开环境”,在离开环境之后还有的变量则是需要被删除的变量。

垃圾收集器给内存中的所有变量都加上标记, 然后除了环境中的变量以及被环境中的变量引用的变量。在此之后再被加上的标记的变量即为需要回收的变量, 因为环境中的变量已经无法访问到这些变量。

 function fn(){
            var a =1;
            return function(){
                return a++;
            }
        }

2 引用计数
低版本的IE使用这种方式。 机制就是跟踪一个值的引用次数, 当声明一个变量并将一个引用类型赋值给该变量时该值引用次数加1, 当这个变量指向其他一个值,该值的引用次数便减一。 当该值引用次数为0时就会被回收。
该值引用次数为0时,还不能被回收,一直占据内存,叫做内存泄漏。

闭包

概念:定义在一个函数内部的函数(函数嵌套函数),闭包就是将函数内部和函数外部连接起来的一座桥梁。
闭包的特点:
在一个函数内部定义另外一个函数,并且返回内部函数。(外部获取函数内部的变量)
内部函数可以读取外部函数定义的局部变量(利用函数内部的函数间接将函数内部的变量返回)
让局部变量始终保存在内存中(保持内部的函数一直访问)。也就是说,闭包可以使得它诞生环境一直存在。
注意冲突和依赖
全局变量一直存在,少用,函数内部的变量用完即销毁,可以用。

function fn(){
       var a = 100;//局部
       function fnA(){
           alert(a);
       }
       fnA()
    }
    fn();

形成独立的作用域(开发的环境)
闭包的写法 - 开发的常见写法(不是最优)

(function(){
       var a = 100;//局部
       function fnA(){
           alert(a);
       }
       fnA();
   })();

   !function(){
       var a = 100;//局部
       function fnA(){
           alert(a);
       }
       fnA();
   }();

总结:
1.面试(概念,优缺点,应用场景)
2.开发中的一种格式 - 闭包写法
3.避免全局污染。

什么是闭包(闭包的原理)

闭包的形成与变量的作用域以及变量的生存周期密切相关,变量的作用域,就是指变量的有效范围。

生存周期对于全局变量是永久的,除非我们主动销毁这个全局变量。(垃圾回收机制)

而对于在函数内用 var 关键字声明的局部变量来说,当退出函数时,它们都会随着函数调用的结束而被销毁:

总结:全局变量一直存在,少用,函数内部的变量用完即销毁,可以用。

闭包就是能够读取其他函数内部变量的函数**。由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的特点

在一个函数内部定义另外一个函数,并且返回内部函数。**

内部函数可以读取外部函数定义的局部变量(利用函数内部的函数间接将函数内部的变量返回)

让局部变量始终保存在内存中。也就是说,闭包可以使得它诞生环境一直存在。

闭包的优缺点–面试题

闭包的好处:

希望一个变量长期存储在内存中(延长作用域)。

避免全局变量的污染。

私有成员(函数内部的变量)的存在。

闭包的缺点:

变量常驻内存,增加内存使用量–手动销毁,设为null

使用不当会很容易造成内存泄漏–IE

闭包的应用场景

1、永久存储函数内部的变量,有弊端(增加内存使用量)

2、避免全局变量的污染–利用闭包的写法进行开发

3、自执行的匿名函数保存循环变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值