Как правильно написать for-in
цикл в JavaScript? Браузер не жалуется ни на один из двух подходов, которые я здесь показываю. Во-первых, есть такой подход, при котором переменная итерации x
объявляется явно:
for (var x in set) {
...
}
И в качестве альтернативы этот подход, который читается более естественно, но мне не кажется правильным:
for (x in set) {
...
}
javascript
syntax
for-in-loop
футлиб
источник
источник
var
не использовалась , чтобы объявить итераторi
:Uncaught ReferenceError: i is not defined
. Так что с этого момента я буду использовать его: / webpack странно обрабатывает «глобальные» переменные, подробнее см .: stackoverflow.com/a/40416826Ответы:
Использование
var
, это уменьшает область действия переменной, в противном случае переменная ищет ближайшее замыкание в поискахvar
оператора. Если он не может найти,var
значит, он глобальный (если вы находитесь в строгом режимеusing strict
, глобальные переменные вызывают ошибку). Это может привести к следующим проблемам.Если вы напишете
var i
в цикле for, появится предупреждение2
.Область видимости и подъема JavaScript
источник
var
внутриfor
головы выглядит как локальное в цикле for, а это не так. Следовательно, я предпочитаю стиль user422039 ниже.Первая версия:
объявляет локальную переменную с именем
x
. Вторая версия:не.
Если
x
это уже локальная переменная (т.е. у вас естьvar x;
илиvar x = ...;
где-то раньше в вашей текущей области (т.е. текущая функция)), они будут эквивалентны. Еслиx
это еще не локальная переменная, то использование второй неявно объявляет глобальную переменнуюx
. Рассмотрим этот код:Вы могли бы ожидать , что это предупреждение
hey
,there
,heli
,hey
,there
,copter
, но так какx
это один и тот же она будет предупреждатьhey
,there
,there
,hey
,there
,there
. Вы этого не хотите! Используйтеvar x
вfor
петлях.В довершение ко всему: если
for
цикл находится в глобальной области видимости (т.е. не в функции), то локальная область видимости (при использованииx
объявляется область видимостиvar x
) такая же, как и глобальная область видимости (областьx
неявно объявляется в если вы используетеx
без var), поэтому две версии будут идентичны.источник
Вы действительно должны объявлять локальные переменные
var
, всегда .Вам также не следует использовать циклы for ... in, если вы не уверены, что это именно то, что вы хотите сделать. Для перебора реальных массивов (что довольно часто встречается) всегда следует использовать цикл с числовым индексом:
Итерация по простому массиву с помощью «for ... in» может иметь неожиданные последствия, потому что ваш цикл может подбирать атрибуты массива помимо численно проиндексированных.
edit - здесь в 2015 году также можно использовать
.forEach()
итерацию по массиву:В
.forEach()
метод присутствует в прототипе Array начиная с IE9 и далее.источник
На самом деле, если вам не нравится объявление в
for
заголовке, вы можете сделать:Как упоминалось в других ответах на этот вопрос, неиспользование
var
вообще вызывает ненужные побочные эффекты, такие как назначение глобального свойства.источник
Используйте тот, в котором вы объявляете переменную цикла с помощью
var
. Неявно объявленные переменные имеют другую область видимости, которая, вероятно, не соответствует вашим намерениям.источник
это часто встречающийся образец, но он отличается от
в C ++ в том, что переменная не привязана к
for
блоку. Фактически,var
объект поднимается в верхнюю часть охватывающей области (функции), поэтому локальный объектi
будет эффективно доступен как доfor
цикла (после начала текущей области / функции), так и после него.Другими словами, делать:
такой же как:
ES6 имеет
let
ключевое слово (вместоvar
) для ограничения области действия блоком for.Конечно, вам СЛЕДУЕТ использовать локальные переменные (объявленные с помощью
var
илиlet
илиconst
(в ES6)), а не неявные глобальные переменные.for(i=0; ...)
илиfor(i in ...)
потерпит неудачу, если вы используете"use strict";
(как следует) иi
не заявите.источник
Использование
var
- самый чистый способ, но оба работают, как описано здесь: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...inПо сути, с помощью
var
вы гарантируете, что создаете новую переменную. В противном случае вы можете случайно использовать ранее определенную переменную.источник
Я думаю, что var хорош по соображениям производительности.
Javascript не будет просматривать всю глобальную область видимости, чтобы увидеть, существует ли x где-то еще.
источник
С общей точки зрения, первая версия будет для индекса, который должен находиться в области видимости цикла, а другой - любой переменной в области видимости, в которой был вызван конструктор цикла.
Если вы собираетесь использовать индекс цикла внутри цикла for и это не потребуется другим в следующих строках, лучше объявить переменную с помощью «var», чтобы вы были уверены, что «x» соответствует индексу цикла, инициализированному с помощью 0, в то время как другой, если в этом контексте доступна другая переменная "x", она будет перезаписана индексом цикла - у вас будут некоторые логические ошибки -.
источник