js——高阶函数、闭包、递归

目录

一、高阶函数

1、什么是高阶函数

2、把一个函数作为参数

3、return 返回的也是一个函数

二、闭包

1、闭包是什么

2、变量的作用域

3、案例

4、结果展示:

 5、总结:

扫描二维码关注公众号,回复: 14784585 查看本文章

三、递归

1、什么是递归

2、案例一

3、分析

4、问题

5、栈溢出又是什么呢

6、解决方法

7、案例二

8、分析

9、结果展示:

10、总结


一、高阶函数

1、什么是高阶函数

高阶函数是那些操作其他函数的函数。用最简单的话来说,高阶函数就是一个将函数作为参数或者返回值函数。就是满足以下两种函数都可以称为高阶函数

(1)把一个函数作为参数

(2)return 返回的也是一个函数

2、把一个函数作为参数

举例说明:

<script>
        function fn(a,b,callback){
            console.log(a+b);
            callback && callback() 
//如果第一值callback不存在(false),直接返回false,如果第一个值存在,则运行第二个值 callback()
        }
        fn(1,2,function(){
            console.log('我是最后调用的');
        })
    </script>

上面的例子意思就是,我定义了一个函数fn,里面有三个参数,a,b以及一个函数callback,然后输出a+b,然后我再执行callback函数,他会先执行a+b,然后再执行callback函数

结果截图:

3、return 返回的也是一个函数

举例说明:

<script>
        function fn(){
            return function(){}
        }
        fn();
</script>

 

这里return 返回的是一个函数,那他就是高阶函数

总结:高阶函数是对其他函数进行操作的函数,他接受函数作为参数或将函数作为返回值输出

二、闭包

1、闭包是什么

闭包指有权访问另一个函数作用域中变量的函数

简单理解就是,一个作用域可以访问到另外一个函数内部的局部变量

2、变量的作用域

我们先复习一下关于变量的作用域的知识,来帮我们更好的理解闭包

 变量的作用域

        变量的作用域的不同分为两种:全局变量局部变量

        1、函数内部可以使用全局变量

        2、函数外部不可以使用局部变量

        3、当函数执行完毕,本作用域内的局部变量会销毁

3、案例

script>
        function fn(){
            num =8
            function fun(){
                console.log(num);
            }
            fun()
        }
        fn()
    </script>

分析:首先我们定义了一个函数名叫fn的函数,我们在里面定义了一个num = 8 ,然后我们又在fn的函数中又定义了一个名叫fun的函数,然后我们在fun这个函数里面打印了num的值

4、结果展示:

 5、总结:

我们成功在fun函数中调用了fn函数中的变量num,也就是我们闭包说的在访问另一个函数作用域中变量的函数,这就是闭包。

三、递归

1、什么是递归

 如果一个函数在内部可以调用其本身,那么这个函数就是递归函数

简单理解:函数内部自己调用自己,这个函数就是递归函数

2、案例一

function fn(){
    fn()
  }
 fn()

3、分析

我们使用函数声明:用 function 关键字声明一个函数,再执行一个函数名fn,这种声明函数的方式我们是需要在函数外面调用函数的,但我不仅仅在函数外面调用,我在函数里面也调用了函数,是调用自己的函数。这就是一个最简单的案例

4、问题

像我们上面这样使用递归很容易发生“栈溢出”错误(stack overflow),结果如下图,原因是因为什么呢,举个例子,我们的递归其实跟我们的for循环很像,他会一直调用自己,但是如果这个函数里面还存在了一些变量或者数据的话,那他就会去内存开辟空间来保存这些数据,那么问题就来了,他一直在调用,就会一直开辟空间,那么就会导致“噶了”

5、栈溢出又是什么呢

每次执行JavaScript代码时,都会分配一定尺寸的栈空间(Windows系统中为1M),每次方法调用时都会在栈里储存一定信息(如参数、局部变量、返回值等等),这些信息再少也会占用一定空间,如果存在较多的此类空间,就会超过线程的栈空间了。
说白了就是就是不顾堆栈中分配的局部数据块大小,向该数据块写入了过多的数据,导致数据越界,结果覆盖了别的数据。

6、解决方法

就是当我们的代码的结果达到了我们所需要的效果就给他结束掉,也就是加一个return 

7、案例二

<script>
        var num = 1
        function fn(){
            console.log('枕头睡不醒');
            if(num == 10){
                return
            }
            num++
            fn()
        }
        fn()
    </script>

8、分析

我们首先定义了一个num=1,我们又定义了一个函数交fn,最外层绝对是要调用fn函数的,不然就没法运行了,我们又在里面再次调用了fn函数,在fn函数中我们想要打印‘枕头睡不醒’,重点来了,我们这里有一个判断条件,当这个num 的次数=10 的时候,我们就终止函数return掉,然后num++,也就是每次执行完之后num值+1。这样就不会发生栈溢出的问题了

9、结果展示:

10、总结

递归就是如果一个函数在内部可以调用其本身,那么这个函数就是递归函数,记住使用递归的时候一定要加return哦!防止出现‘栈溢出’的问题

猜你喜欢

转载自blog.csdn.net/weixin_52984349/article/details/128068049