快速搞定闭包与递归

闭包

  • 闭包: 内部函数引用外部变量

function fn () {    
    var b = new Array(200000).fill('Green')  
    function closure(){        
        debugger;        
        // 访问外部变量b        
        console.log(b);    
    }       
    closure(); // 触发闭包形成    
}

  • 如代码,我们可能会想到闭包的存活周期有多久?
    • 只要对应closure函数没有被引用,随着fn函数执行结束,closure函数(闭包)也将结束

高阶函数
  • 一个函数return 另一个函数,叫做高阶函数
function fn () { 
    return function(){}             
}

应用场景
  • 内部函数引用外部变量 + 内部函数向外暴露 = 内部函数只要不销毁,就可以持续访问到外部函数的变量 让数据持久,但又不至于到全局,引起全局命名冲突

递归

  • 程序调用自身的编程技巧称为递归( recursion)
function fn() {     
    fn();  // 无限递归调用,   stack overflow}
}

避免栈内存溢出的递归必要处理条件(二选一)
(一)设置递归条件
var i = 0;function fn() {      
    if (i++ < 10) {  
    // 避免无限递归调用,   stack overflow      
    fn();        
}}

(二)设置函数结束条件
var i = 0;
function fn() {    
if (i++ > 10)return;    
// 避免无限递归调用,   stack overflow    
fn();     
}

递归返回值【难点】😫

斐波那契数列
  1. 在第一个月时,只有一对小兔子,过了一个月,那对兔子成熟了,在第三个月时便生下
  2. 一对小兔子,这时有两对兔子。再过多一个月,成熟的兔子再生一对小兔子,而另一对小兔子长大,有三对小兔子

图片

分析
  • 从结果探寻规律是编程人员常用的技巧:看【兔子总数】,由 1 => 1 => 2 => 3 => 5 => 8(别管TM的兔子怎么弄,只看结果🤣)
  • 规律就是__初始1和1, 后续的结果为前两个数的和__,这个思路你学废了吗?😎
非递归实现
function fibonacci(n) {    
    var n1 = 1, n2 = 1, sum;    
    for (let i = 2; i < n; i++) {        
        sum = n1 + n2        
        n1 = n2        
        n2 = sum    
    }    
return sum}
fibonacci(5)
递归实现
  1. 第五次的结果 = 第四次 + 第三次
  2. 看图得知:第一次、第二次都为1, 所以【1 、 1 、 2 、 3】 ,最后结果为5
function fibonacci(n) {    
    if (n === 1 || n === 2) return 1;    
    return fibonacci(n-2) +  fibonacci(n-1);
}
fibonacci(5)

我的博客只写前端博文,点击我去看更多喜欢的前端博文,欢迎大家一起讨论学习!【https://blog.csdn.net/qq_29101285?spm=1011.2266.3001.5343】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值