В Javascript ES5 и более ранних версиях нет области блока, только область действия. Кроме того, объявления всех переменных javascript, объявленных в области действия функции, автоматически "поднимаются" в начало функции.
Таким образом, объявление переменной в цикле ничем не отличается от объявления ее в начале функции, а затем ссылки на нее в цикле.
См. эти две ссылки для некоторых полезных пояснений: .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
будут локальными только для цикла.
person
jfriend00
schedule
27.10.2011