我们可能被诱导而将 var a = 2 看作是一个语句,但是 JavaScript 引擎 可不这么看。它将 var aa = 2 看作两个分离的语句,第一个是编译期的任务,而第二个是执行时的任务。

    这将导致在一个作用域内的所有声明,不论它们出现在何处,都会在代码本身被执行前 首先 被处理。你可以将它可视化为声明(变量与函数)被“移动”到它们各自的作用域顶部,这就是我们所说的“提升”。

    声明本身会被提升,但不是赋值,即便是函数表达式的赋值,也 不会 被提升。

    要小心重复声明,特别是将一般的变量声明和函数声明混在一起 —— 如果你这么做的话,危险就在眼前!