闭包和递归

闭包定义

闭包就是能够读取其他函数内部变量的函数,由于在 Javascript 语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数”。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的用途:

可以在函数外部读取函数内部成员

让函数内成员始终存活在内存中(局部变量持久化)

闭包原理

实际上在js的作用域机制中,有一个作用域是永恒的,就是window全局作用域,只要浏览器窗口不关闭,全局作用域是不会销毁的,这个windows全局作用域就是永恒的,在全局作用域中定一个函数,无论调用几次,这几次调用都可以共享操作同一个全局变量。

然而局部作用域不是啊,它只是在函数调用的时候有效,函数调用完成之后,局部作用域就关闭了,也就意味着局部变量就失效了。所以我们在全局作用域下获取不到局部变量,再其他的作用域下也获取不到局部变量。

但是闭包不一样啊,可以让它的父函数作用域永恒,像windows全局作用域,一直在内存中存在。这也是闭包的本质。也是咱们上课讲的闭包的第二个作用锁住局部变量。当闭包函数调用时,它会动态开辟出自己的作用域,在它之上的是父函数的永恒作用域,在父函数作用域之上的,是window永恒的全局作用域。闭包函数调用完了,它自己的作用域关闭了,从内存中消失了,但是父函数的永恒作用域和window永恒作用域还一直在内存是打开的。闭包函数再次调用时,还能访问这两个作用域,可能还保存了它上次调用时候产生的数据。 只有当闭包函数的引用被释放了,它的父作用域才会最终关闭(当然父函数可能创建了多个闭包函数, 就需要多个闭包函数全部释放后,父函数作用域才会关闭)。

递归

概念:在程序中函数直接或间接调用自己

注意: 使用递归函数一定要注意,处理不当就会进入死循环,递归一定要有结束的条件。递归函数只有在特定的情况下使用 ,比如阶乘问题。

方法一:普通递归

  代码优美逻辑清晰。但是有重复计算的问题,如:当n为5的时候要计算fibonacci(4) + fibonacci(3),当n为4的要计算fibonacci(3) + fibonacci(2) ,这时fibonacci(3)就是重复计算了。运行 fibonacci(50) 会出现浏览器假死现象,毕竟递归需要堆栈,数字过大内存不够。

方法二:改进递归-把前两位数字做成参数避免重复计算

方法三:改进递归-利用闭包特性把运算结果存储在数组里,避免重复计算

方法三1:改进递归-摘出存储计算结果的功能函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值