2012-05-20 2 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; для (bar в Foo)/* ... */'вместо: ^) – rjz

ответ

4

Без ключевого слова var, bar становится глобальной переменной. Вам нужно:

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)
Смежные вопросы