1.定义:无论作用域中的声明出现在什么地方,都将在代码本身被执行前首先进行处理。
    JavaScript 引擎认为。它将 var a 和 a = 2 当作两个单独的声明,第一个是编译阶段的任务,而第二个则是执行阶段的任务。
    2.可以将这个过程形象地想象成所有的声明(变量和函数)都会被“移动”到各自作用域的
    最顶端,这个过程被称为提升。
    3.声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。
    4.函数提升要比变量提升的优先级要高一些,且不会被变量声明覆盖,但是会被变量赋值之后覆盖。
    image.png