for 循环不是函数,是js的基本流程控制语句块,所以for循环声明的i可以循环外被引用。当for循环定义在函数里面时,作用域时函数内的局部作用域:
function foo() {
for (var i = 0; i < 3; i++) {
//
console.log(i);
}
i += 100; // for循环外仍然可以引用变量i
console.log(i);
}
foo();
console.log(i);// 函数外引用i, 报错,未定义
for 循环声明在 <script>
标签里时,作用域是全局作用域:
<script>
for (var i = 0; i < 3; i++) {
console.log(i);
}
i += 100; // for循环外仍然可以引用变量i
console.log(i); // for循环外仍然可以引用变量i
</script>
for 循环的声明的i也会被提升,同样不赋值:
console.log(i); // undefined
for (var i = 0; i < 3; i++) {
console.log(i);
}
i += 100;
console.log(i);
由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的,为了解决块级作用域,ES6引入了新的关键字let,用let替代var可以申明一个块级作用域的变量:
function foo() {
var sum = 0;
for (let i = 0; i < 100; i++) {
sum += i;
console.log(i);
}
// i is not defined:
i += 1;
}
foo();
网友评论