回调函数:一个函数被作为参数传递给另一个函数,这时的实参是一个函数
这里的例子是将外部声明的函数fm调给fn函数里面的arg函数
<script>
function fn(arg) {
var arg = function fm() {
console.log("111")
}
console.log("222")
arg()
console.log("333")
}
function fm() {
var i = 10
var b = 20
console.log(`444`)
}
fn(fm)
fm()
</script>
根据程序运行步骤:先调用fn函数执行,将函数fm传递给形参,这时fn里面的arg函数只声明未调用,所以执行222的语句,当调用arg函数后,则打印111的语句,然后按照顺序执行333的语句,执行完fn里面的函数后,退出,这时调用了fm函数,所以打印了444这条语句
函数自调用:函数表达式可以自己调用自己,也叫立即执行函数
它有以下方式:(1)添加括号,用于说明该函数是一个表达式
<script>
(function fn(){
var x="5555"
console.log(x)
console.log("4444")
})()
fn()
</script>
若再使用fn()来调用的话则会出错
(2)若该函数是一个匿名函数,可以将其赋给一个变量,再在函数声明结束后的花括号后面加一个小括号等价于var re=arr()
<script>
var arr=function (){
var x="111"
console.log(x)
console.log("222")
}()
</script>
例题:函数自调用例子
<script>
function fn(n) {
if (n <= 1) { //终止条件
return 1 //这里返回最后一次调用的值
} else {
return n * fn(n - 1)
}
}
var re = fn(5)
console.log(re)
</script>
这里调用函数后传入一个5的实参,fn里的条件是当n小于等于1是返回1,其他值时返回n*fn(n-1),因为5是从外面传进来的,所以每次都会从函数外面进来再判断
第一次返回的值为5*fn(5-1)
第二次返回的值为4*fn(5-1-1)
第三次返回的值为3*fn(5-1-1-1)
第四次返回的值为2*fn(5-1-1-1)
第五次返回的值为1*fn(5-1-1-1-1)
所以最终结果是5*4*3*2*1=120