0

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

<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

4 回答 4

4

没有关键字var,bar成为全局变量。你需要:

for (var bar in Foo) {

或者,

var bar;
for (bar in Foo) {
于 2012-05-20T21:12:58.770 回答
1

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

此外,bar没有声明,JavaScript 将假定它是global.

于 2012-05-20T21:12:58.083 回答
0

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

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

var foo = [];
for (var i=0; i<foo.length; i++)
    // do something with foo[i]
于 2012-05-20T21:18:29.420 回答
0

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

  • 使用var关键字,例如var foo
  • 在函数参数中创建变量,例如function myFunc(foo)
于 2012-05-20T21:20:44.500 回答