1.函数的预解析
* 函数的预解析
*
* 预解析的一个表现就是 声明式函数再定义前可以被调用
*
* 预解析是什么?
* JS 在执行代码的时候, 会有一个 所谓的 解析阶段
* 解析阶段, 做了一件事, 就是 函数提升, 就是将 声明式 函数的定义, 提升到当前 作用域的最顶端
*
* 作用域的最顶端:
* 暂时理解为 当前页面的最开始的位置
2.作用域
* 作用域
* 什么是 作用域? (这是一道面试题)
* 就是变量可以起作用的范围
*
* 作用域分为两个
* 1. 全局作用域(直接在 script 内书写的代码)
* 再此作用域创建的变量, 我们叫做全局变量, 在当前 script 标签内的哪里都能使用
* 在 JS 中, 全局作用域中有一个 提前给我们准备好的 对象(一种数据格式, 后续会详细的讲解)
* 这个 对象叫做 window
* 我们创建的全局变量, 会被自动添加到 window 对象中
*
* 2. 局部作用域(在 JS 中, 只有函数能够创建局部作用域)
* 在此作用域创建的变量, 只能在当前作用域使用, 超出这个作用域(也就是在函数外边)去使用, 就会找不到变量
3.作用域链
* 作用域链 (这是一个纯概念性的东西, 面试也可能会问)
*
* 作用域链就是在访问一个变量的时候, 如果当前作用域内没有
*
* 会去自己的父级作用域, 也就是上一层作用域内查找, 如果找到就直接使用, 如果没有找到继续向上层查找
*
* 直到查找到 最顶层的全局作用域, 如果找到了直接使用, 如果没找到 报错提示变量不存在(未定义)
*
* 我们将这个一层一层向上查找的规律, 叫做作用域链
* 作用域链的赋值规则
* 在给变量赋值的时候, 首先会去当前作用域查找, 如果有直接赋值, 并停止查找
*
* 如果没有, 会去自己的父级查找, 在父级找到直接修改值然后停止查找, 如果没有继续向自己的父级查找, 直到找到全局作用域
*
* 在全局作用域内, 找到直接赋值修改他的值, 如果没有找到, 那么会在全局作用域创建一个变量, 并赋值
4.递归函数
* 递归函数
*
* 本质上还是一个函数
*
* 当一个函数在函数的内部, 调用了 自身, 那么就算是一个 所谓的 递归函数(只不过有点小缺陷)