Scope

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();

你可能感兴趣的:(Scope)