This is because the JavaScript engine will move ("hoist") the variable decalaration to the top of the function no matter where it is declared inside the function1. JavaScript does not have block scope.
{
//Some code
for(var i=0;i<5;i++){}
alert(i);
//Some code
}
Is equivalent to:
{
var i;
//.. some code
for(i=0;i<5;i++){}
alert(i);
}
1 Unless it's the exception being caught with a catch
clause; that variable is scoped to catch
block.
Update
For defining block scope variables ecmascript 6 specs (javascript 1.7) introduces let. Currently this will work only in latest version of FireFox browser and in consensus stage.
<script type="application/javascript;version=1.7">
//Some code
for (let i = 0; i < 10; i++) {
alert(i); // 1, 2, 3, 4 ... 9
}
alert(i); // Here you will get an error here saying ReferenceError: i is not defined.
}
</script>
Fiddle