作用域 递归函数(多个例子解释)

91 阅读2分钟
1.作用域
变量的使用区叫作用域
a.全局作用域
  在script内的变量  在哪里都可以使用 浏览器在运行的时候会把我们的所有对象放在window里面 
  <script>
    var a = 100
    var a1 = "window" //这里两个都在window里面
    </script>
b.局部(函数)作用域
  简单的来说就是在函数内部的变量(大括号里面) 只能在函数内部使用 不会存在window里面 
  function fn () {
  var b = 100 
  console.log(b) //函数内部的变量 不会保存在window里面
  }
2.变量的访问规则和赋值规则
  相同点 :两者都是只会向上找 
  区别 :
  变量访问规则 :先在当前作用域查找--如果找不着向上一层查找--一直向上查找--如果到全局作用域还是找不到就会报错
  赋值规则 :先在当前作用域查找--如果找不着向上一层查找--一直向上查找--如果到全局作用域还是找不到就会将变量定义为全局变量 并赋值(就是自己本身的值)
  补充点:作用域链 先在当前作用域查找--如果找不着向上一层查找--一直向上查找 这种一层一层向上找一个链条叫作用域链
3.递归函数
条件:a 一个函数内部调用了本身
     b 还有一个结束条件(转折点) 如果没有转折点会一直执行下去 会是一个死递归 对电脑不友好 
     如果不太好理解我们来举一个例子:
  计算一个阶层的值
     function fn (n) {
        if (n == 1) {   //结束条件 必须有不然死循环
            return 1  //返回值
        }
         return n * fn(n - 1)  
     }
     var sum = fn(8)  //接收返回值
     console.log(sum)  //打印返回值
     首先我们要知道数学上的阶层是什么?例如:100的阶层 
     100! = 100*99*98*97........*2*1 //这就是100的阶层
     我们可以发现:
    100! =  100 * 99!
    99! = 99 * 98!
    第一次循环
    实参 : 8 
    形参  n = 8
    if判断不执行
    返回一个return 8 * fn(7)
    fn(7) 
    /**
     * 实参 : 7
     * 形参 : n = 7
     * if判断不执行
     * 返回一个return 7 * fn(6)
     ...........
     fn(1)
     /**
     * 实参 : 1
     * 形参 : n = 1
     * if判断执行(满足n == 1)
     * 返回一个return 1 
 如果还是不太理解,我们从生活出发:
  如果我要去看电影,可是由于一些原因,我来晚了,电影已经可是,我走了进去 黑灯瞎火的我不知道我在几排 我问我旁边的小姐姐 我在想她说了我肯定可以推出我在第几排,可是她不知道,她又问了前面一排的人,前面一排也不知道,就一直这么问下去,直到问到第一排(转折点 结束条件),她又告诉后面一排的人我在第一排 一直这样告诉下去我就知道我在第几排了.