js中作用域的使用以及递归函数(变量的访问规则\作用域链(纯概念))

58 阅读3分钟

1.作用域:

     *      我们的变量 !! 不是说 在任何地方都可以使用
     *      就是变量有一个使用区间, 这个可以使用的区间 就叫做 作用域
     * 
     *  作用域分为两个(现在所学的暂时为两个)
     *      1. 全局作用域
     *          就是再 script 标签内部声明的变量 就是全局作用域的变量
     *          在 全局作用域声明的变量, 在哪里都可以使用
     *          浏览器在运行的时候 会给我们一个 window 对象, 我们的全局作用域 内声明的变量 全都在 window 对象中
     *      2. 局部(函数)作用域
     *          就是在 函数内部 的大括号内 这个区间叫做 函数作用域
     *          在函数作用内声明的变量, 只能在当前函数内部使用, 在函数外部(超过作用域了) 就无法使用
     *          函数作用域内声明的变量, 不会挂载到 window 对象上
列:
   var a = 100 // 在全局作用域中声明的变量, 同时他也会挂载到全局对象 window
    var a1 = '这是我手写的' // 在全局作用域中声明的变量, 同时他也会挂载到全局对象 window

    console.log(window)

    function fn() {
        // 这里边就是函数作用域
        var amyFn = '我是在函数作用域内声明的变量'
        console.log(amyFn)  // 我是在函数作用域内声明的变量
    }
    fn()

    console.log(amyFn)  // amyFn is not a defined

2.作用域链: 变量的访问规则 * console.log(a) * 会先在自己当前作用域内查找 变量 a, 找到直接使用(打印) * 如果没有找到!!! 会向上层作用域查找, 不会向下层查找!!! * 如果 上层作用域 内也没有找到, 会继续向 上层作用域的上层作用域查找(相当于是去自己爷爷级作用域) * * 一直会找到最顶层的全局作用域, 找到就是用, 找不到 就报错 * * 变量的赋值规则 * a = 1 * 会先在自己当前作用域内查找 变量a, 找到直接赋值 * 如果没找到!!! 会向上层作用域查找, 不会向下层查找!!! * 如果上层作用域内也没有找到, 会继续向上层作用域的上层作用域查找(去自己的爷爷级作用域) * * 一直会找到最顶层的全局作用域, 找到直接赋值, 找不到 将 变量定义为全局变量 并赋值 * * * 作用域链(纯概念) * 在自己作用域内查找, 找不到去上层, 不会去下层, 这样一层一层的一个链条 我们叫做作用域链 * * 简单总结: 永远向上查找, 不会向下 3. 递归函数 * 条件1 一个函数 在内部 调用了 自身 * 条件2 在合适的实际 结束调用(结束递归) 一定要有, 不然就是 死递归

4.课堂案列: * 现在有一个特殊的数列前两位固定为为1 * 从第三位开始,他的值为前两位相加的和 * * 列:1 1 2 3 5 8 13 21 34 55 89 144 * **/ function fn(n){ if (n == 1 || n == 2){ return 1 //设定条件返回值为固定1 } return fn(n - 1) + fn(n - 2) //形参为n,且为前两位之和所以n -1 n-2表示前一位和前第二位 } var sum = fn(8) //传参:为第几位,输出不为8 为第八为上的数字21; console.log(sum);