2014-09-10 2 views
1

Как мы знаем, JavaScript не имеет BLOCK SCOPE, поэтому, когда я написал цикл, как показано ниже:Как объявить переменную курсора в javascript?

list = [1, 2, 3, 4]; 
// notice about the `var` keyword 
for(var i = 0; i < list.length; ++i) { 
    // Do something. 
} 
console.log(i); // shows 4 

Дело в том: я должен использовать var объявить переменную i?


ЕСЛИ ТАК:

Когда у меня есть два или более последовательный цикл, я хочу использовать тот же курсор переменной i, она будет объявить более чем один раз! Это просто проблема!

for(var i = 0; i < list1.length; ++i) { 
    // do something. 
} 

for(var i = 0; i < list2.length; ++i) { 
    // do something. 
} 

// `i` was declared more than once! 

В этой форме, переменная курсора i может быть объявлен более чем один раз, а сам код означает, что переменная i может иметь объем внутри для блока, но на самом деле не является.


ЕСЛИ НЕ ТАК:

Должен ли я явно объявить все для курсоров ранее в функции?

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
    // do something 
} 

for(j = 0; j < count2; ++j) { 
    // do something 
} 

for(k = 0; k < count3; ++k) { 
    // do something 
} 

Если я код таким образом, я думаю, что код ужасен: он имеет большое расстояние между декларацией и использованием, а также неясной о том, что они при объявлении.

Если я опускаю объявления для них всех и просто использую, эти переменные курсора попадают в globals! Это намного страшнее!


Так что я прошу о хорошей практике, как объявить переменную курсора в этом случае?

Вам нужна ваша помощь.

+0

В блоке есть область видимости _some_ JavaScript: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let –

+1

@MattBall хорошо, но, похоже, она не получила широкого распространения, я не смог использовать его под хром-отладчиком. –

+0

Оба способа делают то же самое, и обе практики хорошо установлены. – Bergi

ответ

0

Объявление переменной поднимает ее до вершины функции, и последовательные объявления синтаксически законны, но игнорируются. Итак:

var i, j, k; // and maybe a long list that I didn't expected? 

// Maybe some other code. 

for(i = 0; i < count1; ++i) { 
// do something 
} 
... 

- это то, что интерпретатор делает под капотом, если вы заявили его несколько раз.

Таким образом, декларируя это таким образом (переменные в верхней части), обычно предлагают то, что люди предлагают (и что предлагает JSLint).

3

Как правило, проще всего объявить переменную, а затем использовать ее в нескольких не-вложенных циклах.

var i; 

for(i = 0; i < list1.length; i++) { 
    // do something. 
} 

for(i = 0; i < list2.length; i++) { 
    // do something. 
} 

Там нет никаких проблем с повторным использованием i в нескольких циклах. Как только начинается второй цикл, значение устанавливается на начальное значение, и все в порядке.

+1

Я не думаю, что проблема, вызванная '++ i', существует, это не условие цикла. @Alex Wayne –

+1

Нет разницы между использованием '++ i' и' i ++ 'в части обновления цикла. Результат выражения не используется в условии. – Bergi

+0

Ты прав, мой плохой! –

Смежные вопросы