变量提升
在js中,使用变量前需要先对其进行声明,所有的js声明变量都由关键字var声明(还有let...)。如果只是声明了变量,并未对其赋值,那么该变量默认值为undefined。
变量提升也就是把变量提升到当前作用域(或者函数)的顶部位置,注意的时,提升的只是变量的声明,并不会将变量的值一同提升上来。列如:
函数提升
函数声明:以关键字function开头的函数为函数声明。
函数表达式(函数字面量):不是以function开头的均可被称为函数表达式
如图所示:
在js代码执行之前引擎会先进行预编译,预编译期间会将函数声明提升到当前作用域的最顶端。函数提升只会提升函数声明,函数提升是可以直接在函数声明之前调用函数的,且成功执行它。但是不会提升函数表达式。 如果是两个函数声明,出现在后面的函数声明可以覆盖前面的。
列如:
函数提升比变量提升的优先级要高;
列如,当函数名和变量名同名的情况下,看看他们的结果:
按照上面变量提升的例子,第一个打印的结果应该为undefined,但是他两个打印值为函数test()函数体,由此可见函数提升比变量提升的优先级要高一些,但是函数不会被变量的声明覆盖,会被变量赋值之后覆盖,如图所示,函数的值被覆盖了: