Что вы подразумеваете под "current < mailArchive.length
было бы лучшим условием закрытия"?
Кроме того, функция print
здесь на самом деле ничего не требует. Он просто получает current
и значение mailArchive[current]
в качестве параметров. Это также не закрытие, просто примечание.
Несмотря на это, автор «Красноречивого JavaScript» только пытается показать, что вместо использования Objects таким неуклюжим образом, существует встроенная конструкция - Array. Который вы пройдете , используя current < mailArchive.length
.
Что касается того, что он выполняет - in
- это оператор, который проверяет, принадлежит ли свойство (в данном случае значение current
) объекту (mailArchive
здесь). Поскольку свойства называются так же, как индексы («0», «1» и т. Д.), Их намерения очень похожи на обычные
for (var current = 0; current < mailArchive.length; current++)
петля.
Однако есть несколько проблем с этим. Оператор in
ищет свойства не только самого объекта, но и всей цепочки его прототипов. Это означает, что если бы для этого объекта mailArchive
был определен прототип, оператор in
также проанализировал бы свойства прототипа. Обычно это не то, что вы хотите в своих циклах.
Есть способы преодолеть это. Обычно метод hasOwnProperty
(определенный для объекта) используется для различения свойств, принадлежащих самому объекту.
Указанный выше цикл for
можно переписать так:
for (var current in mailArchive)
{
if( mailArchive.hasOwnProperty(current) )
{
print("Processing e-mail #", current, ": ", mailArchive[current]);
}
}
но это считается чем-то плохим.