day06

44 阅读2分钟

1.函数的预解析

*  函数的预解析
     * 
     *      预解析的一个表现就是 声明式函数再定义前可以被调用
     * 
     *      预解析是什么?
     *          JS 在执行代码的时候, 会有一个 所谓的 解析阶段
     *              解析阶段, 做了一件事, 就是 函数提升, 就是将 声明式 函数的定义, 提升到当前 作用域的最顶端
     * 
     *      作用域的最顶端:
     *          暂时理解为 当前页面的最开始的位置
     
     

2.作用域

*  作用域
     *      什么是 作用域?          (这是一道面试题)
     *          就是变量可以起作用的范围
     * 
     *      作用域分为两个
     *          1. 全局作用域(直接在 script 内书写的代码)
     *                  再此作用域创建的变量, 我们叫做全局变量, 在当前 script 标签内的哪里都能使用
     *                  在 JS 中, 全局作用域中有一个 提前给我们准备好的 对象(一种数据格式, 后续会详细的讲解)
     *                          这个 对象叫做 window
     *                  我们创建的全局变量, 会被自动添加到 window 对象中
     * 
     *          2. 局部作用域(在 JS 中, 只有函数能够创建局部作用域)
     *                  在此作用域创建的变量, 只能在当前作用域使用, 超出这个作用域(也就是在函数外边)去使用, 就会找不到变量
     

3.作用域链

 *  作用域链    (这是一个纯概念性的东西, 面试也可能会问)
     * 
     *      作用域链就是在访问一个变量的时候, 如果当前作用域内没有
     * 
     *      会去自己的父级作用域, 也就是上一层作用域内查找, 如果找到就直接使用, 如果没有找到继续向上层查找
     * 
     *      直到查找到 最顶层的全局作用域, 如果找到了直接使用, 如果没找到 报错提示变量不存在(未定义)
     * 
     *      我们将这个一层一层向上查找的规律, 叫做作用域链
     
     
     
     
     
      *  作用域链的赋值规则
     *      在给变量赋值的时候, 首先会去当前作用域查找, 如果有直接赋值, 并停止查找
     * 
     *      如果没有, 会去自己的父级查找, 在父级找到直接修改值然后停止查找, 如果没有继续向自己的父级查找, 直到找到全局作用域
     * 
     *      在全局作用域内, 找到直接赋值修改他的值, 如果没有找到, 那么会在全局作用域创建一个变量, 并赋值
     
     
     

4.递归函数

 *  递归函数
     * 
     *      本质上还是一个函数
     * 
     *      当一个函数在函数的内部, 调用了 自身, 那么就算是一个 所谓的 递归函数(只不过有点小缺陷)