函数(下)

50 阅读3分钟

作用域(重点)

  • 什么是作用域,就是一个变量可以生效的范围
  • 变量不是在所有地方都可以使用的,而这个变量的使用范围就是作用域

全局作用域

  • 全局作用域是最大的作用域
  • 在全局作用域中定义的变量可以在任何地方使用
  • 页面打开的时候,浏览器会自动给我们生成一个全局作用域 window
  • 这个作用域会一直存在,直到页面关闭就销毁了

image.png

局部作用域

  • 局部作用域就是在全局作用域下面有开辟出来的一个相对小一些的作用域
  • 在局部作用域中定义的变量只能在这个局部作用域内部使用
  • JS 中只有函数能生成一个局部作用域,别的都不行
  • 每一个函数,都是一个局部作用域

image.png

变量使用规则(重点)

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

访问规则

  • 当我想获取一个变量的值的时候,我们管这个行为叫做 访问

  • 获取变量的规则:

    • 首先,在自己的作用域内部查找,如果有,就直接拿来使用
    • 如果没有,就去上一级作用域查找,如果有,就拿来使用
    • 如果没有,就继续去上一级作用域查找,依次类推
    • 如果一直到全局作用域都没有这个变量,那么就会直接报错(该变量 is not defined)

image.png

  • 变量的访问规则 也叫做 作用域的查找机制
  • 作用域的查找机制只能是向上找,不能向下找

image.png

赋值规则(*)

  • 当你想给一个变量赋值的时候,那么就先要找到这个变量,再给他赋值

  • 变量赋值规则:

    • 先在自己作用域内部查找,有就直接赋值
    • 没有就去上一级作用域内部查找,有就直接赋值
    • 还没有再去上一级作用域查找,有就直接赋值
    • 如果一直找到全局作用域都没有,那么就把这个变量定义为全局变量,再给他赋值

image.png

递归函数

  • 什么是递归函数
  • 在编程世界里面,递归就是一个自己调用自己的手段
  • 递归函数: 一个函数内部,调用了自己,循环往复
  • 递归弊端: 递归的次数大于一定次数,会导致内存中的栈溢出,也叫爆栈. (解决方案使用循环方式解决)

image.png

简单实现一个递归

  • 我们先在用递归函数简单实现一个效果

  • 需求: 求 1 至 5 的和

  • 思路: 函数自己调用自己 希望传一个数,函数返回当前1 -- 该数的求和

    • n =1; fn (1) =>1
    • n =2; fn (n) => 1+2=>fn(1)+2
    • n =3; fn (n) => 1+2+3 =>fn(2)+3
    • n =4; fn(n) => 1+2+3+4 = > fn(3)+4
    • n =5; fn(n) => 1+2+3+4 +5= > fn(4)+5
    • 结束

image.png