对全局和本地变量访问感到困惑

时间:2014-06-21 19:30:21

标签: javascript storage

虽然它在不同范围内命名相同变量的不良形式。 仍然好奇地知道它是如何工作的。

我在许多范围内使用变量命名数需要知道访问父和祖父范围变量的方式。

var number = 2;
var bool = true;
var fun = function(numbs){

    console.log(number);
    //here it displays 2

    var number =numbs;
    console.log(number);
    //here it  displays 3


    console.log(window.number);
    //i can get global variable value here

    if(bool){

        var number = 4
        console.log(number);

        //here it display 4

        console.log(window.number);
        //here it display 2



        console.log();
        // how do i get 3 which is variable in the parent scope
    }
}

fun(3);

3 个答案:

答案 0 :(得分:0)

如果在范围中声明变量,则无法访问在更大范围内声明的具有相同名称的变量(全局除外,使用window)。

但是请注意var的范围是当前函数(不是当前块),因此当您使用var number = 4时,您将覆盖上面声明的数字。

如果你真的想要将这些变量命名为相同,你可以尝试

var scope1 = {
    number: 2,
    bool: true
};
(function(numbs){
    var scope2 = {}, scope3 = {};
    console.log(scope1.number); // 2
    scope2.number = numbs;
    console.log(scope2.number); // 3
    console.log(scope1.number); // 2
    if(scope1.bool){
        scope3.number = 4
        console.log(scope3.number); // 4
        console.log(scope1.number); // 2
        console.log(scope2.number); // 3
    }
})(3);

答案 1 :(得分:0)

您需要了解JavaScript中的variable hoisting。此外,JavaScript具有功能范围,而不是像您期望的那样阻止范围。

someVariable = 10;

var someVariable;

//Turns out to be:

var someVariable;
console.log(someVariable); // undefined
someVariable = 10;

所以你的功能实际上是:

var fun = function (numbs) {
    var number;
    console.log(number);
    //here it displays undefined and not 2.

    number = numbs;
    console.log(number);
    //here it  displays 3

    console.log(window.number);
    //i can get global variable value here

    if (bool) {

        number = 4
        console.log(number);
        //here it display 4

        console.log(window.number);
        //here it display 2

        console.log();
        // how do i get 3 which is variable in the parent scope
        // No parent scope either global or local scope, use numbs
    }
}

答案 2 :(得分:0)

抱歉,但是这个:

console.log(number);
//here it displays 2

不显示2我不认为,因为此时number未定义。

number = 2; // <-- global variable
var number = 2; // <-- not global
编辑:我知道这并没有明确回答你的问题,但它可能含蓄地回答了问题