代码如下:
var test1 = "globalVariable";
function test(){
console.log(test1);
var test1 = "localVariable";
console.log(test1);
}
上述函数执行的结果是:先输出"undefined",再输出"localVariable"。
很多人都会误以为结果是:先输出"globalVariable,再输出localVariable"。其实不然,由于函数作用域的特性,局部变量在整个函数体始终是有定义的,也即,在函数体内局部变量遮盖了同名全局变量,但是只有在程序执行到var语句的时候,局部变量才会被真正的赋值。因此,上述过程相当于,将函数内的变量声明提前至函数体顶部,同时变量初始化留在原来的位置。就相当于如下这个函数
代码如下:
var test1 = "globalVariable";
function test(){
var test1; //将函数内的变量声明提前至函数顶部
console.log(test1);
test1 = "localVariable"; //赋值
console.log(test1);
}
但是,如果函数内没有用var声明变量,情况又有所不同。
代码如下:
var test1 = "globalVariable";
function test(){
console.log(test1);
test1 = "localVariable";
console.log(test1);
}
这个函数执行的结果是:先输出"globalVariable",再输出"localVariable"。
由于函数体内的test1变量没有用var声明,就默认为全局变量,当然就不存在变量提前声明的问题。第一行就会输出"globalVariable",而第三行改变了test1全局变量的值,输出了"localVariable"。