
上QQ阅读APP看书,第一时间看更新
2.1.6 变量提升
在JavaScript里,用var关键字声明的变量的声明语句都会被默认放在其作用域的最顶部,即使其声明语句在函数的最底部,它也会优先于其他类型的语句执行。因此在代码中是可以先使用变量,然后再去定义变量的,例如:

这段代码可以正常输出a的值,输出如图2.9所示。

图2.9 样例输出2.9
虽然变量定义可以提前,但是其赋值语句是不能提前的,因此遇到提前定义变量的情况,在调用该变量前一定要先给其赋值,否则变量的类型就会变为undefined,例如:

这段代码输出的a是“undefined”,输出如图2.10所示。

图2.10 样例输出2.10
虽然JavaScript支持变量提升,但是还是建议在其作用域顶部声明变量,这样会避免出现以上问题,而且代码的可读性也比较好,便于维护。
我们在2.1.4节中提到过,使用let关键字声明的变量是不存在变量提升现象的,因此使用let声明变量的语句位置不会变动。对于JavaScript初学者,建议尽量使用let关键字来声明变量,因为它更加严谨,可以避免许多问题。但因为两个关键字总体上是大同小异的,读者可以根据自身喜好进行选择。