预解释,又叫做变量提升,是指在javascript运行前,对变量进行提前声明,要注意的点是带var关键字和function关键字的预解释机制不同.
var关键字声明的变量只声明但是不赋值,function关键字声明的变量既声明又赋值.
上面所说的也导致了在js的函数执行过程中,var关键字后面的变量会被重新赋值,而function声明的变量则不会被重新赋值.
我们来看一个例子:
函数在执行前,对带有关键字var和关键字function的变量进行预解释,var关键字声明的变量只声明不赋值,function关键字申明的变量既声明又赋值,预解释之后,a是function a(){console.log(2)};
之后函数按照从上到下的顺序执行,第一行相当于a(){console.log(2),所以输出2.接着执行到第二行,a被重新赋值了一个新的函数,再执行到第五行,因为是function关键字在预解释时就已经声明且赋值过,这里直接跳过,不会再重新赋值,再执行到第六行,a输出1;
这就是var跟function变量提升之间的区别,我们再来看两个例子:
思考一下,这里会输出什么?
答案是报错因为var关键字在预解释时只声明不赋值,所以此处a执行输出的是会显示not a function
此处会输出2.因为function关键字在预解释阶段既声明又赋值,所以执行时会输出的是2.
over.