关于js中闭包的一些理解

简介:梳理一下闭包的好处和应用。

闭包

js变量的作用域主要可以分为全局和局部,在函数里面的变量就称为局部变量。因为函数在执行完后,变量就会被回收,所以有的时候我们想要多次改变一个变量的时候,就会把它设置成全局变量。首先来看写成局部的:

function f() {
    var count = 0;
    console.log(++count);
}
f(); // 1
f(); // 1
f(); // 1

这里虽然运行了三次,但是,结果都是1。因为对于每一个f()来说,他们的内存都是独立的,也就是你操作你的count,我操作我的count,互不干扰。想要共享这个count,就只能把count变为全局的:

var count = 0;
function f() {
    console.log(++count);
}
f(); // 1
f(); // 2
f(); // 3

这样就可以达到效果。顺带一提:全局的变量函数外和函数内都可以访问,局部变量就只能在内部被访问。如果变量命名相同,那么在局部中,局部变量优先。

但是全局变量是很不安全的,任何函数都可以改变它。所以我们现在既想要函数可以共享变量,又不想这个变量能被太多的函数都访问。为了解决这个问题,就可以使用函数的闭包。
所谓闭包,就是函数里面嵌套函数,这样就可以营造出一个"小全局"。相当于原本整个js是一个城市,现在我们用一个function圈了一块地,然后在这里建立了一个小城市,那么这个小城市的公共资源,小城市里面的人是可以共享的,但是小城市以外的其它的就不行了。(也就是说,因为小城市也是大城市的一部分,所以小城市的人既可以共享大城市的公共资源,也可以共享小城市的资源,而大城市以内小城市以外的人,就只能共享大城市的资源,不可以享受小城市的)。代码如下:

function f() {
    var count = 0;
    return function() {
        console.log(++count);
    };
}
var g = f();
g();g();g();// 打印出1,2,3

此代码中,f函数就相当于那个小城市,里面的count就是小城市特有的公共资源。运行一次f函数,会返回一个函数对象,也就是g。那么对于这个g来说,每一次运行,count都是公共的,共享的。
要注意的是,如果f函数运行多次,那么相当于开辟了很多个独立的"小城市",每个小城市都有自己的count,其它城市是没法共享的,比如:


function f() {
    var count = 0;
    return function() {
        console.log(++count);
    };
}

var g1 = f();
g1();g1();g1();// 打印出1,2,3

var g2 = f();
g2();g2();g2();g2()// 打印出1,2,3,4

从中可以看出g1和g2的环境的独立的,各自的count并不共享。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值