什么叫做的变量的提升?
说到这里原本淡定的心情忽然间变得,有点小小的鸡冻了!
首先,大家先看一个函数:
var a = 123;
function f(){
console.log(a);
var a = 1;
console.log(a);
}
f();
您可能会想当然的认为console.log(a);第一次显示的是123(也就是全局变量a的值),而第二次显示的是1(也是就局部变量a)。但是实际上,却不是这样!第一次实际上显示的是undefined.原因在于函数域始终优于全局域,所以局部变量a 会覆盖掉所有域它同名的全局变量,尽管在.
这也就是说,当javaScript执行过程进入新的函数时,这个函数内部被声明的所有变量都会被移动(或者说提升)到函数最开始的地方.另外被提升的只有变量的声明.只有函数体内声明的这些变量在该函数执行开始时就存在,而与之相关的赋值操作并不会被提升.它还在原来的位置上.譬如在前面的例子中,局部变量本身被提升到了函数开始处,但并没有在开始处就被赋值为1.
因此,上面的函数可以等价的改写为:
function f(){
var a ;
console.log(a);//a=undefined;
a = 1;
console.log(a);//a=1
}
f();
当然,也可以采取在最佳实践中提到过的单一var模式.在这个例子中,我们可以手动提升变量的位置,这样一来就不会被javaScript的提升行为所混淆.