在我们的JavaScript程序中,使用一个变量之前应当先声明,变量是使用关键字var来声明的。JavaScript声明提前机制会把当前词法作用域中的所有声明放到作用域的顶端。如果是函数内部的声明,那么此变量在函数内部任何地方都是有定义的。
看这段代码
var scope = "global";
function f( ){
console.log(scope); //输出"undefined",而不是"global"
var scope = "local";
console.log(scope); //输出“local”
}
你可能会误以为函数中的第一行会输出“global”,因为声明提前和函数作用域,scope在整个函数体中都是有定义的,但是代码还没运行到var初始化的那一行,局部变量没有真正赋值,所以函数第一个打印出“undefined”。上述过程可以等价于:将函数内的声明变量“提前”至函数体顶部,同时变量初始化留在原来的位置:
var scope = "global";
function f( ){
var scope;
console.log(scope); //输出"undefined",而不是"global"
scope = "local";
console.log(scope); //输出“local”
}