1. 全局作用域
全局变量拥有全局作用域
2. 函数作用域
在函数内声明的变量用于函数作用域。
在函数体内,局部变量的优先级高于同名的全局变量。
2.1 声明提前
函数作用域:在函数内声明的所有变量在函数体内始终是可见的。即JavaScript中所有变量的声明,都被提前至函数体的顶部。
[JavaScript]
function test(o) {
var i = 0;
if (typeof o == "object") {
var j = 325;
for (var k = 0; k < 5; k++) {
console.log(k);
}
console.log("for循环语句外:" + k); //=> "for循环语句外:5"
}
console.log("if条件语句外:" + j); //=>"if条件语句外:325"
}
//等价版本(声明提前版本)
function testV2(o) {
var i = 0;
var j; //声明提前
var k; //声明提前
if (typeof o == "object") {
j = 325;
for (k = 0; k < 5; k++) {
console.log(k);
}
console.log("for循环语句外:" + k);
}
console.log("if条件语句外:" + j);
}
var obj = {
x: 1
};
test(obj);
testV2(obj);
[JavaScript]
var scope = "global";
function f() {
console.log(scope); //=>"undefined",而不是"global"
//局部变量在这里声明并初始化,但变量在函数体内任何地方均是有定义的。同名局部变量覆盖了全局变量。
var scope = "local";
console.log(scope); //=>"local"
}
f();
//等价版本(声明提前版本)
function fV2() {
var scope; //声明提前
console.log(scope); //=>"undefined"
scope = "local";
console.log(scope); //=>"local"
}
fV2();