闭包的理解 二

简单的闭包示例

function f1(){
    var a=1;
    function f2(){
        console.log(a)
    }
    f2()
}
f1()

其实闭包看起来就像是直接返回一个值而已,那这样的话,为什么不直接写成下面这样 还更简单

function f1(){
    var a=1;
    return a;
}
console.log(f1())

对吧,看结果不都是一样的?不就是返回了个值么,那明显第二种更简单啊

但是 第二种里边的变量a并不能长久保存,只有在调用这个函数的时候才会生成这个变量,想长久保存的话就定义成全局变量,但全局变量定义太多会造成变量污染,并且,你定义的这些全局变量可能会跟别人的重名,那么到时候代码运行,会调用的是哪一个就不好说了,当你引用第三方的代码时,说不定就重名了,而且,全局变量的命名规范也是个问题

闭包可以长久保存局部变量又不会造成全局污染

代码示例

function f1(){
    var i=1;
    i++;
    return i;
}
console.log(f1());
console.log(f1());
console.log(f1());

多次调用 f1() ,你会发现其实打印的结果一直都是2
而这,就是因为普通的函数的局部变量只会在调用时创建,调用完毕后就被销毁了

而闭包则不同
闭包代码示例

function f1(){
    var i=1;
    function f2(){
        i++
        console.log(i)
    }
    return f2;
    
}
var f=f1()
f();
f();
f();

像这个代码就可以实现 i 的累加

但需要注意的是,其实闭包是需要一个对象来接收它的返回值的,说到底跟全局对象其实还是很像的,就只是换了个方式,用全局对象来保存一个值,不信你看下面这个例子

function f1(){
    var i=1;
    function f2(){
        i++
        console.log(i)
    }
    return f2;
    
}
f1()()
f1()()
f1()()
 

是不是发现这个其实还是一直打印的2
那就对了,因为没有一个变量接收闭包的返回值,所以它的值一直被后面的f1()()所刷新

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值