JS函数预解析及作用域和作用域链

73 阅读2分钟

函数的预解析

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

函数的作用域

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

函数的作用域链

    作用域链就是在访问一个变量的时候, 如果当前作用域内没有
           会去自己的父级作用域, 也就是上一层作用域内查找, 如果找到就直接使用, 如果没有找到继续向上层查找
           直到查找到 最顶层的全局作用域, 如果找到了直接使用, 如果没找到 报错提示变量不存在(未定义)
           我们将这个一层一层向上查找的规律, 叫做作用域链