作用域与递归函数

115 阅读3分钟

一、作用域

作用是有使用区间的,变量不是说明之后在哪里都可以用,他有一个使用的范围,我们把这个范围叫做 作用域

二、作用域的分类

1、全局作用域:

  1. JS给我们提供了一个叫做window的全局作用域,可以理解为 整个script标签内的作用域,就是全局作用域

  2. 全局变量都会挂载到 window 对象上

    var num=100
    var aaa=10000
    /*
            根据规则,这里是script标签内部,所以是全局作用域,我这个num
    */
    //console.log(num) //100
    //console.log(aaa) //10000
    
    var name="千锋" //因为全局作用域window 上有一个属性叫name,所以我们的全局变量,要避
    //免起名的时候叫做name,尤其是开发的时候
    console.log(window)
    

2、局部作用域

  1. 在JS中,有且只有函数能够创建,局部作用域(函数作用域),局部作用域开始何结束位置,就是函数代码段开始和结束的位置

  2. 在局部作用域(函数作用域)内,声明的变量叫做局部变量

  3. 局部变量,不会挂载到window对象上

    function fn(){
        var num=100
        console.log(num) //100
        console.log(window)//
    }
    

二、什么是作用域链

1、变量的访问规则

变量访问会,现在当前作用域内查找,找到拿来直接用,如果过没有找到会去上层作用域查找;

如果上层作用域没找到,会继续上层作用域上层作用域内查找

var num=100
function fn(){
    function fn1(){
        console.log(num)
    }
    fn1()
}
fn()
/*
        首先在fn1 这个作用域内 访问变量
                会在当前作用内查找num变量,如果访问不到,则返回上一层作用域查找
                在fn 这个作用域内 访问变量 如果有则直接使用,没有返回上一层作用域
                最后,在全局变量中,访问变量,查找变量num 找到了 num=100
                故此,打印100
*/

2、 变量的赋值规则

  1. 变量赋值会先在当前作用域内查找,找到了直接拿来的赋值,如果没有,会去上层作用域内查找,找到了直接赋值;

  2. 如果上层作用域也没有找到,会继续区上层作用域 的啥高层作用域内找找,找到了直接赋值,没找到继续网上

  3. 如果找到了全局变量内,还是没有找到变量,那么会直接将变量定义为在当前作用域内(全局作用域),然后赋值

    function fn() {
                function fn1() {
                    num = 1000;
                }
                fn1()
            }
            fn()
            console.log(num)
    /*
            首先访问 fn1这个作用域,给变量num赋值
                    那么会在当前的作用域查宅
    */
    
  • 在查找变量时,会在当前作用域,找到就用,就没找到上层找找,一直会查找到顶层作用域,(全局--window)
  • 然后查找过程中,我们把逐层向上的一层一层查找,所构成的一个链条,叫做作用域链(实际是没有作用域链的,这是一个纯概念的东西)
  • 注意: 作用域链只会向上查找,不会向下

三、递归函数

  • 在函数内部调用自己,调用自身。此时就是写了一种递归,但是死递归

  • 要想写一个正确 的递归函数,需要在递归内部,写上,返回点(到某个条件是,停止递归)

      function fn(){
              if(满足条件){
              fn()
              }
              if(不能满足条件1,满足条件2){
              //结束递归函数
              }
      }
      
    

斐波那契数列

  • 数列:1 1 2 3 5 8 13 21 34 55...

  • 规则:前两位必须是1 ,从第二位开始,每一位是前两位的和

      function fn(n){
            if(n ==1 || n==2){
                return 1
            }
            return fn(n-1) + fn(n-2)
       } 
       var num=+prompt("请输入一个数字")
       var sum=fn(num)
       console.log(sum);