В Javascript ES5 и более ранних версиях отсутствует область блока, только область действия функции.Более того, объявления всех переменных javascript, объявленных в области видимости функции, автоматически "поднимаются" в начало функции.
Таким образом, объявление переменной внутри цикла ничего не делаетотличается от объявления его в верхней части функции и последующего обращения к нему внутри цикла.
См. эти две ссылки для некоторых полезных объяснений: http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting и http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-javascript-hoisting-explained/.
Примечание: присваивание переменной не выполняется, только объявление переменной.Итак, если вы сделаете это:
function a() {
for (var i=0; i<100; i++){
var myvar = i;
}
}
Это работает так:
function a() {
var myvar;
for (var i=0; i<100; i++){
myvar = i;
}
}
Если вы хотите создать новую область в цикле for
, вы можете использовать IIFE(немедленно вызывается выражение функции), например:
function a() {
for (var i=0; i<100; i++){
(function() {
var myvar = i;
// myvar is now a separate variable for each time through the for loop
})();
}
}
Обновление в 2015 году. ES6 (или иногда называемый ES2015) предлагает объявление let
, которое предлагает область действия блока.В этом случае объявление переменной let
поднимается только до верхней части текущей области блока.По состоянию на середину 2015 года это еще не получило широкого распространения в браузерах, но скоро будет доступно и доступно в серверных средах, таких как node.js или через транспортеры.
Итак, в ES6, если вы сделали это:
for (let i=0; i<100; i++){
let someVar = i;
}
И i
, и someVar
будут локальными только для цикла.