前端三剑客之JavaScript——递归函数、作用域、变量的使用规则

92 阅读4分钟

递归函数

定义:是函数的一种应用书写方式,除非不到万不得已不建议使用,原因是因为递归很消耗代码执行(影响性能)

递归:

递:一个一个的递进去

归:一个一个的再回来

递归的本质:就是自己调用自己,说白了就是把一件事拆解成多个步骤去执行。

注意点:

递归书写的时候,先写终点,然后再写归回来的内容代码,在js函数中归用return

------------下面写两个案例,如果想了解更多,请按部就班慢慢学,后面会有---------------

//递归书写5的阶乘 
function fn1(n){ 
    //先写终点 
    if(n == 1){
        return 1; 
    } 
    //再写归回去的内容代码
    return n * fn(n - 1) 
}
console.log(fn1(5))
//递归书写求第十个斐波那契数列中值是几 
//如果不知道斐波那契数列是啥,自行百度 
function fn2(n){ 
    if(n == 1 || n == 2){
        return 1; 
    }
    return fn(n - 2) + fn(n - 1) 
}
console.log(fn2(10))

作用域(重点)

  • 什么是作用域,就是一个变量可以生效的范围
    • 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域
    • 也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
  • 作用域分类
    • 全局作用域
    • 局部作用域也叫私有作用域或者是函数作用域
  • 作用域上下级关系
    • 你在哪一个作用域下书写的函数,就是哪一个作用域的子级作用域

1、全局作用域

  • 全局作用域是最大的作用域
  • 在全局作用域中定义的变量可以在的任何地方使用
  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域window
  • 这个作用域会一直存在,直到页面关闭就销毁了
// 下面两个变量都是存在在全局作用域下面的,都是可以在任意地方使用的 
var num = 100 
var num2 = 200 
// 在全局作用域下书写了一个 函数f1 
// 此时 f1 也是在全局作用域下 function f1() {}

2、局部作用域

  • 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域
  • 在局部作用域中定义的变量只能在这个局部作用域内部使用
  • 在js中只有函数能生成一个局部作用域,别的不行
  • 每一个函数都是一个局部作用域
// 这个 num 是一个全局作用域下的变量 在任何地方都可以使用 
var num = 100 
function fn() { 
    // 下面这个变量就是一个 fn 局部作用域内部的变量 
    // 只能在 fn 函数内部使用 
    var num2 = 200 
} 
fn()

变量使用规则

  • 有了作用域以后,变量就有了使用范围,也就有了使用规则
  • 变量使用规则分为两种,访问规则和赋值规则

1、定义规则

  • 你定义在哪一个作用域下的变量,就是哪一个作用域的私有变量
  • 该变量只能在该作用域及其后代作用域中使用
function f1() { 
    // f2 : 定义在 f1 私有作用域的变量 
    // 只能在 f1 及其 f1 的后代作用域内使用 
    // 全局不能使用 
f2 function f2() { 
    // 这里可以使用 num 吗 ? 
    // 可以, 因为 f2 是 f1 的后代作用域 
    console.log(num); 
    } 
    f2() 
    // num 只能在 f1 和 f1 的后代作用域内使用 
    var num = 100 
} 
f1()

2、访问规则

  • 当我想获取一个变量的值的时候,我们管这个行为叫做访问
  • 获取变量的规则
    • 首先,在自己的作用域内部查找,如果有,就直接拿来用
    • 如果没有,就去上一级作用域查找,如果有,就拿来用
    • 如果没有,就继续去上一级作用域查找,以此类推
    • 如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)
    • 变量的访问规则也叫做作用域的查找机制
    • 作用域的查找机制只能是向上找,不能向下找

3、赋值规则

  • 当你想给一个变量赋值的时候,那么就先要找到这个变量,在给他赋值
  • 变量赋值规则:
    • 先在自己作用域内部查找,有就直接赋值
    • 没有就去上一级作用域内部查找,有就直接赋值
    • 在没有再去上一级作用域查找,有就直接赋值,以此类推
    • 如果一直找到全局作用域都没有,那么就把这个变量定义为全局变量,在给他赋值