顾名思义即函数内部自己调用自己;
举例:
<script>
function fn () {
console.log(666)
// console.log(fn)//打印全局函数fn
fn() //调用fn函数
}
fn()//调用fn函数
//没有终止条件,函数一直自调用,一直打印666,这样会造成无限循环,
</script>
我们在函数中加入判断条件,设置何时终止自调用:
<script>
function fn () {
if(){ //这里设置满足条件
return 100
}
else{
console.log(123)
fn()
}
}
fn()
</script>
我们通过求阶乘的方法了解函数自调用,通过其思想逐步引入函数自调用的使用。
<script>
function fn (n) {
if(n<=1){ //设置函数自调用终止条件
return 1
}
else{//n>1时重复执行该语句
return n*fn(n-1)
}
}
var re=fn(10)//传入初始值10
console.log(re)// 1*...*10
//每次调用过后的变化
//fn(10)==>10*fn(9)==>10*9*fn(8)==>10*9*8*fn(7)==>....10*9...2*fn(1)
</script>
加大难度:(需要寻找规律)
<script>
//要求函数返回的结果是100+51+26.5+..a(不能小于2),设计函数体结构
/*
首先寻找其中规律每一项是前面一项除2+1 所以得出函数调用的传入值为(n*0.5+1)
然后通过if else设置判断条件,因为a不能小于2,所以小于2时就结束自调用
*/
function fn (n) {
if(n<2){
return 0
}
else{
n+fn(n*0.5+1)
}
}
var re=fn(100)
</script>
在业务逻辑中的运用:
假设你只知道数组内部全是(数字和数组的混套),不知道嵌套了几层,就需要用到函数自调用才能解决
<script>a
var arr=[[1,2,3,4,[2,3,4,5],[2,3,4,5],[4,54,2,6]],[2,3,4,4,5,6]]
//打印出所有数字
function fn(arr){
// 遍历数组
for(var i=0;i<arr.length;i++){
if(typeof(arr[i])=="number"){
console.log(arr[i])
}else{
/*
如果知道有其中有几层嵌套可以通过以下方式
for(var j=0;j< arr[i].length;j++){
if(typeof(arr[i][j])=="number") console.log(arr[i])
else{
arr[i][j].length 因为不知道嵌套了几层 也就不知道该写几次for循环
}
}
*/
//有数组时,从新调用该函数打印其中数字
fn(arr[i])
}
}
}
fn(arr)
</script>