JavaScript 闭包

今天接触到了JavaScript闭包的概念,做个整理与理解,避免以后遗忘。

 一、什么是闭包?
        “官方”的解释是:所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
        这是官方给出的概念,对于初次接触的同学来说,譬如我,很难理解,那么,通过以下一小段代码来帮助理解。
function f1(){
        var b = 3;
        function f2(){
            alert(b);
        }
        return f2();
    }
    var test = f1();
    test();// 3

        在这个f1()函数中,f2()是可以读取到f1的局部变量的,如果不写retrun f2,那想在外部读取f1中的b是不可能的。加了retrun值后,f1就拥有了f2的返回值,就可以在f1外部读取它的内部变量了。
        个人理解:在JavaScript中,分有全局变量与局部变量。在一个函数中可以引用到全局变量,但是一个函数内部的局部变量除了其函数本身,外部函数是访问不到的。而我们在函数内部再定义一个函数,这个内部函数是可以访问到所包含它的外部函数的局部变量,并且通过return返回值,就可以外部调用内部函数的变量。
        简单的说,Javascript允许使用内部函数---即函数定义和函数表达式位于另一个函数的函数体内。而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量、参数和声明的其他内部函数。当其中一个这样的内部函数在包含它们的外部函数之外被调用时,就会形成闭包。
        另:闭包所包含的局部变量会一直存在内存中不会消亡。在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数f1()被f2()引用,f2()又被f1()外的test引用,这就是为什么函数f1()执行后不会被回收的原因。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值