var关键字和javascript函数的作用域

时间:2011-12-12 19:59:32

标签: javascript variables scope var

我想找到最容易确定变量范围的方法。

见下一个例子(jsfiddle):

var foo = function() {
    var bar = function() {
        pub = "public";
        var pri = "private";

        alert(pub) // public
        alert(pri) // private
    };

    // alert(pub) // pub not defined
    bar();
    alert(pub) // public
    // alert(pri) // pri not defined
};

foo();
alert(pub) // public
// alert(pri) // pri not defined

我可以这样说:

1.-所有带有var关键字前缀的变量都将在其功能及其所有嵌套函数中可见?
2.-所有不带var关键字的变量在(函数容器)执行后到处都可见?

3 个答案:

答案 0 :(得分:4)

  1. 这是真的,除非它们被同一变量的另一个内部定义所遮蔽。
  2. 所有没有var的变量都是全局变量,除非它们已经由外部范围定义。
  3. 由于人们提到全局......

    你不应该使用全局变量,总是用var声明你的变量以避免混淆。如果必须使用它们,请将它们范围限定为用于代码的全局命名空间。这有助于避免与页面上的其他代码发生冲突。

    var ns = {};
    // Now use this anywhere in your code
    ns.myGlobal = 49;
    

答案 1 :(得分:1)

是。你已经理解正确了。

将任何变量与前面的关键字“var”一起考虑为该函数可见,它是嵌套函数。可以把任何没有关键字“var”的变量想象成window.variable。

var foo = function() {
    var bar = function() {
        pub = "public";
        var pri = "private";

        alert(pub) // public
        alert(pri) // private
    };

    // alert(pub) // pub not defined
    bar();
    alert(pub) // public
    alert(pri) // pri not defined
};

foo();
alert(pub) // public
alert(pri) // pri not defined

作为一般经验法则,您不应使用全局变量。

答案 2 :(得分:0)

检查一下以获得更清晰......

var foo = function() {
    var pri = "OUTER";// this is what I changed...
    var bar = function() {
        pub = "public";
        var pri = "private";

        alert(pub) // public
        alert(pri) // private
    };

    // alert(pub) // pub not defined
    bar();
    alert(pub) // public
    alert(pri) // pri not defined
};

foo();
alert(pub) // public
alert(pri) // pri not defined