快速搞定闭包与递归

32 阅读2分钟

闭包

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

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】