概念
引擎会在解释JavaScript代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将他们关联起来。因此,正确的思考思路是,包括变量和函数在内的所有声明会在任何代码被执行之前首先被处理。注意,每个作用域都会进行提升操作。
函数提升
函数声明和变量声明都会被提升。但是一个值得注意的细节是函数会首先被提升,然后才是变量。
总结
无论在作用域中的声明在什么地方,都将在代码本身被首先执行前处理。可以将这个过程形象地想象成所有的声明(变量和函数)都会被移动到各自作用域的最顶端,这个过程叫提升。
声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会被提升。