2012-05-20 68 views
0

既然有涉及,即_GetFoo_CountBar不應變量bar是,即使它們都使用一個不同的範圍兩個單獨的功能?如果您複製粘貼並運行它,它將顯示兩個警報的問題。爲什麼這些JavaScript變量共享範圍?

<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份額範圍是什麼?

+2

因爲沒有被綁定到每個函數的作用域,JS假定'bar'被連接到全局 範圍。試試'var bar;爲(酒吧在Foo)/ * ... * /'而不是:^) – rjz

回答

4

沒有關鍵字varbar成爲一個全局變量。您需要:

for (var bar in Foo) { 

或替代,

var bar; 
for (bar in Foo) { 
1

它們共用example,因爲他們都是在一個功能。

此外,bar未被聲明,並且JavaScript將假定它是global

+0

這不是問題... –

+0

@BenAlpert - 現在怎麼樣? –

0

沒有,酒吧不聲明爲函數範圍的局部變量。

但是還有更糟糕的事情:千萬不要在數組中使用for-in-loops!

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

只是爲了擴大一點其他的答案中,有兩種方法可以避免通過函數創建全局變量:

  • 使用var關鍵字,例如var foo
  • 創建函數變量參數,例如function myFunc(foo)