"var "или нет" var "в цикле" for-in " JavaScript?
Как правильно написать for-in цикл в JavaScript? Браузер не выдает жалобу ни на один из двух подходов, которые я показываю здесь. Во-первых, существует такой подход, когда переменная итерации x прямо заявил:
for (var x in set) {
...
}
и в качестве альтернативы этот подход, который читается более естественно, но не кажется мне правильным:
for (x in set) {
...
}
9 ответов
использовать var, это уменьшает область переменной, иначе переменная смотрит до ближайшего закрытия, ища var заявление. Если он не может найти var тогда он глобальный (если вы находитесь в строгом режиме,using strict глобальные переменные выдаст ошибку). Это может привести к следующим проблемам.
function f (){
for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2
если вы пишите var i в цикле for предупреждение показывает 2.
первый вариант:
for (var x in set) {
...
}
объявляет локальную переменную x. Вторая версия:
for (x in set) {
...
}
нет.
если x уже является локальной переменной (т. е. у вас есть var x; или var x = ...; где-то раньше в вашей текущей области видимости (т. е. текущей функции)), то они будут эквивалентны. Если x еще не является локальной переменной, тогда использование второй неявно объявит глобальную переменную x. Считать это код:
var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
for (x in obj1) alert(x);
}
function loop2() {
for (x in obj2) {
loop1();
alert(x);
}
}
loop2();
вы можете ожидать, что это предупредит 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 (var i = 0; i < array.length; ++i) {
var element = array[i];
// ...
}
итерация через простой массив с помощью " for ... В " может иметь неожиданные последствия, потому что ваш цикл может забрать атрибуты массива, кроме численно индексированные.
редактировать - здесь в 2015 году также можно использовать .forEach() для перебора массива:
array.forEach(function(arrayElement, index, array) {
// first parameter is an element of the array
// second parameter is the index of the element in the array
// third parameter is the array itself
...
});
на .forEach() метод присутствует на прототипе массива от IE9 вперед.
на самом деле, если вам не нравится декларация в for заголовок, вы можете сделать:
var x;
for (x in set) {
...
}
как упоминалось в других ответах на этот вопрос, не используя var вообще создает ненужные побочные эффекты, такие как назначение глобального свойства.
используйте тот, где вы объявляете переменную цикла с var. Неявно объявленные переменные имеют другую область, которая, вероятно, не соответствует вашим намерениям.
for(var i = 0; ...)
является широко распространенным шаблоном, но он отличается от
for(int i; ...)
в C++ в том, что переменная не ограничивается for блок. На самом деле,var поднимается в верхнюю часть заключительной области (функции), поэтому локальный i будет эффективно доступен как перед for loop (после начала текущей области / функции) и после нее.
другими словами, делать:
(function(){ //beginning of your current scope;
//...
for(var i in obj) { ... };
})();
это же as:
(function(){ //beginning of your current scope;
var i;
//...
for(i in obj) { ... };
})();
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 где-то еще.
с общей точки зрения, первая версия будет для индекса, который должен жить в области цикла, в то время как другой будет любой переменной в области, где был вызван конструктор цикла.
Если вы собираетесь использовать индекс цикла внутри цикла, и это не потребуется другим в следующих строках, лучше объявить переменную с "var", чтобы Вы были уверены, что" x " для индекса цикла инициализирован с 0, в то время как другой, если другая переменная "x" доступна в этом контексте, это будет перезаписано индексом цикла - то есть у вас будут некоторые логические ошибки -.