2021.5.7 关于闭包

1. 闭包概念

  • 函数作用域是封闭的,独立的,外部执行环境访问不了的
  • 闭包,有权访问另一个函数作用域中的变量的函数
  • 闭包是一个函数,且存在于另一个函数当中,可访问父级函数的变量,且不会被销毁
function person(){
    var name = '有鱼';
    function cat(){
        console.log(name);
    }
    return cat;
}
var per = person();// per的值就是return后的结果,即cat函数
per();// 有鱼 per()就相当于cat()
per();// 有鱼 同上,而且变量name没有销毁,一直存在内存中,供函数cat调用
per();// 有鱼

2. 闭包原理

  • 闭包的实现原理,其实就是利用了作用域链的特性

作用域链就是在当前执行环境下访问某个变量时,如果不存在就一直向外查找,最终找到最外层的全局作用域。这样形成一个链条。

例如: 
var age = 18;
function cat(){
    age++;
    console.log(age);// cat函数内输出age,该作用域没有,则向外层寻找,结果找到了,输出[19];
}
cat();//19

// 如果我们再次调用时,结果会一直增加,也就变量age的值一直递增
cat();//20
cat();//21
cat();//22

但是,全局变量还容易被人修改,比较不安全。为了解决变量污染问题,那就是把变量封装到函数内,让它成为局部变量。

function person(){
    var age = 18;
    age++;
    console.log(age);
}
person();// 19
person();// 19

// 这里又出现问题了,每次调用函数person,进入该作用域,变量age就会重新赋值为18,所以cat的值一直是19
// 所以需要做一下调整
function person(){
    var age = 18;
    function cat(){
        age++;
        console.log(age);
    }
    return cat;
}

var per = person();//per相当于函数cat
per();// 19 即cat() 这样每次调用不在经过age的初始值,这样就可以一直增加了
per();// 20
per();// 21

而且,变量age在函数内部,不易修改和外泄,相对来说比较安全。
在这里插入图片描述

闭包作用

作用:

  • 隐藏变量,避免全局污染
  • 读取函数内部变量

缺点

  • 导致变量不会被垃圾回收机制回收,造成内存消耗
  • 不恰当使用闭包可能会造成内存泄漏问题

垃圾回收机制回收: JS规定在一个函数作用域内,程序执行完以后变量就会被销毁,这样可节省内存;
使用闭包时,因为返回的函数,一直保留了对这个变量的引用,所以变量不会被销毁。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值