众所周知javascript是解释性语言,主要特点为解释一行执行一行。而在js运行时会进行三件事:1语法分析 2.预编译 3.解释执行。语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错误。而预编译发生在代码执行的前一刻,将所有的变量进行整理,例如:
var a = 123;
console.log(a);
会得到123,但当我们将两段代码反过来时:
console.log(a);
var a = 123;
我们得到的结果会是undefined,而不是报错,这是因为我们系统在代码执行前会声明变量和函数,并进行提升,初始赋值为undefined,之后系统会按照从上往下的顺序进行运行赋值,当值在前面时会覆盖undefined,变为赋值的值,如前例的a=123,当值在后面时就是undefined。