为什么这些javascript变量共享范围?

时间:2012-05-20 21:10:53

标签: javascript scope

由于涉及两个单独的函数,即_GetFoo_CountBar变量bar不应该在不同的范围内,即使它们都使用它?如果您复制粘贴然后运行它,它将显示两个警报的问题。

<script type="text/javascript">
 var example = function () {

    var Foo = [];

    function _BuildFoo(size) {
        for (var buildSize = 0; buildSize < size; buildSize++) {
            Foo.push(buildSize);
        }
    }

    function _GetFoo(index) {
        for (bar in Foo) {
            //do Foo bar
        }
    }

    function _CountBar() {
        for (bar in Foo) {
         alert(bar); //bar = 0
         _GetFoo(1);
         alert(bar); //bar is incremented from _GetFoo function and is now 19
         break;
        }
    }

    return {
        _CountBar: _CountBar,
        _BuildFoo: _BuildFoo
    }
}

var foobar = new example();
foobar._BuildFoo(20);
foobar._CountBar();
</script>

为什么_GetFoo_CountBar分享范围?

4 个答案:

答案 0 :(得分:4)

如果没有关键字varbar将成为全局变量。你需要:

for (var bar in Foo) {

或者,

var bar;
for (bar in Foo) {

答案 1 :(得分:1)

他们都共享example,因为他们都在一个函数中。

此外,未声明bar,JavaScript将假定它为global

答案 2 :(得分:0)

不,bar未在函数范围内声明为局部变量。

但是还有更糟糕的事情:永远不要为数组使用for-in-loops!

var foo = [];
for (var i=0; i<foo.length; i++)
    // do something with foo[i]

答案 3 :(得分:0)

只是为了扩展其他答案,有两种方法可以避免通过函数创建全局变量:

  • 使用var关键字,例如var foo
  • 在函数参数中创建变量,例如function myFunc(foo)