目录
一、高阶函数
1、什么是高阶函数
2、把一个函数作为参数
3、return 返回的也是一个函数
二、闭包
1、闭包是什么
2、变量的作用域
3、案例
4、结果展示:
5、总结:
三、递归
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哦!防止出现‘栈溢出’的问题