#博学谷IT学习技术支持#
目录
一、闭包
二、递归
一、闭包
1.闭包到底是什么?(使用chrome 调试查看 )
理解一:闭包是嵌套的内部函数(缩大部分人)
理解二:包含被引用变量(函数)的对象(极少数人)
注意:闭包存在于嵌套的内部函数中
2.如何产生闭包?
当一个嵌套的内部(子)函数引用了嵌套的外部(父)函数的变量(函数)时,就产生了闭包
3.产生闭包的条件?
1)函数嵌套
2)内部函数引用了外部函数的数据(变量/函数)
3)调用外部函数
4.闭包的作用:
1)使用函数内部的变量在函数执行完后,仍然存活在内容中(延长局部变量的生命周期)
2)让函数外部可以操作(读写)到函数内部的数据(变量/函数)
5.闭包的缺点:
1)函数执行完后,函数内的局部变量没有释放,占用内存会变长
2)容易造成内存溢出、泄漏
解决: 及时释放
什么是js垃圾回收机制 ?
js的垃圾回收机制就是定时回收闲置资源的一种机制 , 每隔一段时间, 执行环境都会清理内存中一些没用的变量释放它所占用的内存 .
核心思想 : 找到没用的变量, 释放它们的内存
两种主要的回收策略
标记清除
引用计数
1. 标记清除
标记清除是现在最常使用的垃圾回收策略, 使用标记清除作为垃圾回收机制的浏览器会在垃圾回收程序进行时会做如下几步 :
标记内存中所有的变量
把在上下文(全局作用域, 脚本作用域)中声明的变量,以及在全局被引用的变量的标记删除掉, 剩下的所有带标记的变量就被视为要删除的变量, 垃圾回收执行时释放它们占用的内存
内存清理, 清除垃圾
伪代码简单说明一下 :
2. 引用计数
引用计数是一种不常用的垃圾回收策略, 主要核心思路就是记录值被引用的次数, 一个值被赋给变量,引用次数+1, 这个变量在某个时刻重新赋了一个新值, 旧值的引用次数-1变为了0, 在下次垃圾回收程序进行时就会释放它的内存
引用计数存在的问题 : 循环引用
伪代码简单实例 :
为了避免循环引用的问题 : 我们可以手动将其设置为null
二、递归
1、什么是递归函数
递归函数是在一个函数内通过名字调用自身的情况。
写法一:
缺点:
如果把test方法保存到一个变量,再释放test方法,使指向原始函数的引用只剩下变量。会报错。
如下:
写法二:
优点:
arguments.callee指向一个正在执行的函数的指针。可以解决写法一中的缺点。
缺点:
严格模式下,不支持arguments.callee。
写法三
可以解决写法一、写法二中的问题