关于JS中的变量申明提前,最简单的就是下列例子
var scope = "global";
function f() {
alert(scope);
var scope = "local"; //覆盖全局变量
alert(scope);
}
大家可能误以为函数f的第一个alert会输出"global",因为代码此时还没有执行到var语句声明局部变量的代码行。
其实不然,由于函数作用域的特性,局部变量在整个函数体内始终是有定义的,亦即,在函数体内局部变量覆盖了同名的全局变量。尽管如此,只有程序执行到var语句时,局部变量才会被赋值。因此上述过程等价于,将函数体内的变量声明“提前”至函数体顶部,而变量的初始化保留在原处。
function f() {
var scope; //函数体顶部声明局部变量
alert(scope); //输出"undefined"
scope = "local"; //变量初始化赋值
alert(scope); //输出"local"
}
唯一要注意的是申明提前的作用域————————只能提前到该作用域的顶端