2011-12-15 4 views
0

Какой из этих двух методов для итерации над именами свойств объекта предпочтительнее?for (var propertyName in object) vs for (propertyName in object)?

for (var propertyName in object) { 

} 

против

for (propertyName in object) { 

} 

Я знаю, что во втором примере, ИмениСвойства становится глобальной переменной, которая является то, чтобы избежать, таким образом, я предполагаю, что первый из них будет лучше, правда?

+0

Да, первое лучше, хотя вполне нормально объявлять переменные в отдельном заявлении 'var'. – Pointy

ответ

5

Этот вопрос может быть упрощена:

var a = 0; // option 1 
b = 0;  // option 2 

Как вы сказали:

  • var в варианте 1 ограничивает сферу действия новой переменной; он также позволяет затенять;
  • вариант 2 приведет к новой глобальной переменной или присвоит значение 0 любой существующей переменной с именем b, которая находится в области видимости.

Вариант 1, таким образом, действительно «лучше».

(Однако стоит отметить, что объем propertyName в первом примере будет вмещающий функции, не тела цикла или любой заключающего условного блока.)

1

Да. Именно по этой причине вы заявляете. Зачем выбрасывать данные из вашего цикла, если он не нужен в другом месте?

+0

Но область видимости JavaScript такова, что переменная будет видна во всей функции, в которой происходит этот цикл. В этом отношении JavaScript значительно отличается от некоторых других C-подобных языков. – Pointy

+0

Я немного колебался, но в конечном итоге сделал это потому, что ответ вводит в заблуждение: переменная «выливается» из цикла независимо. –

+0

Несомненно, но когда объявлено в функции, поднимается только для функции scope, а не за ее пределами. – spender

1

Первый. Это эквивалент

var propertyName; 
for (propertyName in object) ... 
1

Это зависит от вашего конкретного использования, но я бы сказал, что для 99,9% вашего первого примера является подходящим. Оставляя ключевое слово var, необязательно делает propertyName глобальным. Он также может ссылаться на ранее определенную переменную в родительской области.

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