每天3小时学前端之JS-第19天-回调函数+递归函数

272 阅读1分钟

此系列体验视频教程

点击观看:哔哩哔哩

什么是回调函数

回调函数:将一个函数作为参数传递到另外一个函数中,并在另一个函数当中调用

function fn1(f) { // 回调函数,接收的是函数
  console.log('fn1');
  f() // 调用接收进来的函数
}
function fn2() {
  console.log('fn2');
}
fn1(fn2)

回调函数与作用域

function fn1(f) {
  var a = 1
  f()
}
var a = 2
function fn2() { // 函数的作用域跟函数的定义相关
  console.log(a);
}
fn1(fn2) // 2

回调函数的传参1

function fn1(f, b) { // 将回调函数f和回调函数f的参数都放在外部的函数上进行传递
  f(b)
}
function fn2(a) {
  console.log(a);
}
fn1(fn2, 1)
fn1(function (a) {
  alert(a)
}, 2)

回调函数的传参2

function fn1(f) {
  return function (b) { // 闭包
    f(b) // 内部调用
  }
}
function fn2(a) { // 外部定义
  console.log(a);
}
function fn3(a) {
  console.log('《' + a + '》');
}
fn1(fn2)(1) // 1
fn1(fn3)(2) // 《2》

练习

function fn(f) {
  return function () {
    console.log(arguments);
    return f(arguments)
  }
}
function add(args) {
  var result = 0
  for (var i = 0; i < args.length; i++) {
    result += args[i]
  }
  return result
}
console.log(fn(add)(1, 2, 3, 4, 5, 6)); // 21

function mul(args) {
  var result = 1
  for (var i = 0; i < args.length; i++) {
    result *= args[i]
  }
  return result
}
console.log(fn(mul)(1, 2, 3, 4, 5, 6)); // 720

递归

function fn(n) {
  console.log(n);
  n--
  if(n > 0) fn(n)
}
fn(6)

function fn(n) {
  console.log(n);
  if(n > 1) fn(n - 1)
}
fn(6)

// 求一个数的阶乘
// 6 1 * 2 * 3 * 4 * 5 * 6
function fac(n) {
  if (n == 1) return 1
  return n * fac(n - 1)
}
console.log(fac(6));

// 斐波那契数列
// 0 1 1 2 3 5 8 13 21
function fb(n) {
  if (n == 1) return 0
  if (n == 2) return 1
  return fb(n - 2) + fb(n - 1)
}
console.log(fb(6));