JS-函数的闭包原理

函数的闭包原理

一、垃圾回收的两种策略

1. 标记清除

JavaScript最常用的垃圾回收策略是标记清除,当变量进入环境(作用域),则将变量标记为进入环境,当变量离开环境的时候,将其标记为离开环境。
垃圾收集器在运行时会给存储在内存中所有变量标记,然后去掉环境变量与被环境变量引用的变量,剩下的就是环境无法访问的变量,这些变量以及其占用的内容空间将被清理回收。

2. 引用计数

引用计数是不太常见的垃圾回收策略。
跟踪每一个值的引用次数。当声明一个引用并将一个引用类型赋值给这个变量的时候,这个值的引用计数加1,如果又把这个引用给了第三个变量,那么引用计数又加1,变成2。如果有变量的引用被指向了别的值,那么引用计数减1,直到等于0。意味着这个值已经不会被变量引用,垃圾收集器下次运行的时候就会清理引用为0的值所占据的内存。
如果一个值的引用出现闭环得话,这个值得引用不会变为0,循环引用使得值得内存永远得不到回收。意味着永远占用内存。

// 引用闭环
let o1 = {}
let o2 = {}
o1.x = o2
o2.x = o1

二、闭包原理

 function foo() {
    let a = "我是foo里面的a";
    consolo.log(a);
 }
 foo(); // 输出“我是foo里面的a”
 console.log(a); // 报错

函数内部的变量在函数外部是无法获取的, 但是如果我们要获得函数内部的某个参数或是变量的值的话, 我们可以用return的方法来实现

 function foo() {
    let a = "我是foo里面的a";
    return a; // 将变量 a return出来
 }
 let b = foo(); // 将foo里面的a传给b
 console.log(b); // “我是foo里面的a”

函数可以通过作用域链互相关联起来, 函数体内部的变量都可以保存在函数作用域内, 这种特性被称为闭包。
闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰

function foo(c){
    let num = c;
    return function A() {
        num++;
        return num;
    }
}
var b = foo(5);
console.log(b()); // 6
console.log(b()); // 7

函数执行后, 垃圾回收
因为参数num被函数A引用了,所以num的数据不会被回收,下一次,b函数执行时还能访问到变量num。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值