Определения переменных во вложенных циклах? - PullRequest
1 голос
/ 11 октября 2011

Некоторые статические языки, такие как Java, по-видимому, имеют особые правила для переменных, определенных в первом аргументе цикла for. Они доступны только по заданному циклу, что делает их в значительной степени похожими на локальные переменные и аргументы функций javascript. Я имею в виду такие вещи:

class ForVariable {
  public static void main(String[] args) {
    for(int i = 0; i != 0; i++) {}
    System.out.println(i); // Throws an Exception
  }
}

Javascript не ведет себя так, что делает вложенные циклы довольно грязным делом. Мой вопрос: Допустимо ли объявлять переменные в последующих циклах с помощью ключевого слова var ? Другими словами - какой из следующих примеров действителен?

for(var i = 0, j; i < 5; i++) {
  for(j = 0; j < 10; j++) <do some stuff>;
}

OR

for(var i = 0; i < 5; i++) {
  for(var j = 0; j < 10; j++) <do some stuff>;
}

Ясно, что неправильно объявлять переменную несколько раз, что сделает 2-й пример запретным, но учитывая тот факт, что 1-й пример - это способ вложения циклов в большинстве известных мне языков не решается объявить победителя.

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

Они оба действительны. Область действия функции против области действия блока.По сути, оба цикла в JavaScript становятся:

function a () {
    var i, j;
    for(i = 0, j; i < 5; i++) {
      for(j = 0; j < 10; j++) <do some stuff>;
    }
}

, поскольку объявления var подняты наверх

1 голос
/ 11 октября 2011

Это не неправильно объявлять переменную несколько раз.Например, действительно нет проблем с:

var i = 0;
var i = 1;

Это правильный JavaScript.Хорошие инструменты, такие как компилятор Closure, будут генерировать предупреждение, хотя, как правило, вы не собираетесь этого делать.

При этом даже компилятор Closure не будет генерировать предупреждение для вашего примера №2.Это просто обычное соглашение в JS, даже если вы технически повторно декларируете.

Любой из ваших двух примеров отлично , но второй является немного более разумным для анализа.В любом случае, я бы об этом не беспокоился.

1 голос
/ 11 октября 2011

Вы не хотите использовать ключевое слово var, а скорее аргументы функции, потому что javascript не имеет блочной области видимости.Например:

[100,200,300].forEach(function (x,i) {
    [10,20,30].forEach(function (y,j) {
        console.log('loop variables, indices '+[i,j]+' have values: '+[x,y]);
    });
})

или

[100,200,300].map(function (x,i) {
    return [10,20,30].map(function (y,j) {
        return x+y;
    });
})

// result: [[110,120,130],[210,220,230],[310,320,330]]
...