0

関係する 2 つの別個の関数があるため、つまり_GetFoo、両方が変数を使用しているにもかかわら_CountBarず、変数barを別のスコープにするべきではありませんか? これをコピーして貼り付けて実行すると、2 つのアラートで問題が表示されます。

<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

他の回答を少し拡張するために、関数を介してグローバル変数を作成しないようにする方法が 2 つあります。

  • varキーワードを使用します。var foo
  • 関数パラメーターで変数を作成します。function myFunc(foo)
于 2012-05-20T21:20:44.500 に答える
0

いいえ、bar は関数スコープでローカル変数として宣言されていません。

しかし、さらに悪いことがあります: 配列に for-in-loop を使用しないでください!

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