2016-07-31 3 views
4

Имея этот два варианта:Объявление переменных внутри или снаружи в обмен на в цикле

Вариант А:

var index; 
for (index in myObject) { 
    // Do something 
} 

Вариант B:

for (var index in myObject) { 
    // Do something 
} 

Я если не знаю параметр B - переменная index, она обновляется каждый раз цикла или только один раз.

ответ

4

Эти два фрагмента кода делают то же самое (и это относится к большинству языков, таких как C, C++ и C# среди других). Если переменная была обновлена ​​на каждой итерации, то, следуя вашей логике, она также будет повторно инициализирована и будет постоянно переходить через один и тот же объект. Ваша петля будет бесконечной.

На боковой ноте, в JavaScript, все объявления переменных попадают в область функций; это означает, что вы можете объявлять переменные где угодно внутри функции, даже внутри вложенных циклов, и они будут объявлены только один раз.

Link to the var documentation

Relevant SO question

Other relevant SO answer

Edit любезно @torazaburo:

Если вы хотите объявить переменную с локальной областью (как, в переменную, которая будет только определенных в текущем блоке, таком как for, while или if, вы можете использовать состояние let Мент:

let var1 = 123; 

Это также позволяет переопределить переменные с тем же именем, но объявленный в более высоком объеме, например, как в этом примере из документации:

function letTest() { 
    let x = 1; 
    if (true) { 
     let x = 2; // different variable 
     console.log(x); // 2 
    } 
    console.log(x); // 1 
} 

Смотрите полную документацию (и примеры) here.

+0

В этом ответе было бы очень полезно включить, что «let' работает в этом контексте. –

2

Предпочтительный подход в 2016 году, чтобы объявить переменную в головке петли, используя let:

for (let i = 0; i < max; i++) { } 
    ^^^ 

Существует, вероятно, минимальное различие в производительности между этим и другими подходами, но существуют значительные преимущества в терминах надежность и ясность вашего кода.

Во-первых, с let, i является локальной по отношению к for конструкции, поэтому он не может «утечки», или модифицировать какой-либо другой i во внешней области видимости.

Во-вторых, и, что еще важнее, для каждой итерации цикла создается новая версия i. С технической точки зрения, вы получаете свежую привязку для каждой итерации, если вы разрешите объявление переменной "(см. this excellent article). Это решает старую проблему замыканий, созданных внутри цикла for, с использованием конечного значения i.Теперь мы можем просто написать

for (let i = 0; i < 10; i++) { 
    setTimeout(() => alert(i), i * 1000); 
} 

вместо того, чтобы сделать какой-то неуклюжий обходным такой, как

for (var i = 0; i < 10; i++) { 
    (function(i) { 
    setTimeout(() => alert(i), i * 1000); 
    }(i)); 
} 

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