关于for循环作用域的一些理解
我们知道JS中变量的作用域在ES6之前,只有两种,一是全局作用域,另一种是函数作用域,那么对于一个比较特殊的存在,for循环的作用域是怎样的呢?
我们先来看一个简单的for循环例子:
for (var i=0;i<5;i++) {
console.log(i);
}
console.log('我是外面的'+i);
// 0, 1, 2, 3, 4, 我是外面的5
很明显,小括号里面的变量,是全局变量。并且在外面访问i的时候,访问到的是for循环执行完之后的值。
我们再看一个例子:
for (var i=0;i<5;i++) {
var j = 10;
console.log(i);
}
console.log('我是外面的'+i);
console.log(j);
// 0, 1, 2, 3, 4, 我是外面的5, 10
也很明显,for循环中,{}里的作用域也是全局作用域,在外面可以访问。
我们再来一个例子:
for (var i=0;i<5;i++) {
var f1 = function() {
var k = 100;
return k;
};
}
console.log(k);
// k is not defined
可以看出,for循环内函数定义的变量,的确是函数作用域的,外面不能访问。
**
综上所述,其实for循环本身,无论的小括号内,还是大括号内的代码块,都是全局作用域的,并不是函数作用域。而for循环内函数定义的变量,则是函数作用域。
**
ES6之后加入了let,来定义块级作用域的变量。那么如果用let来定义for循环的变量会怎样呢?
for (let i=0;i<5;i++) {
let j = 99;
console.log(i);
}
console.log(i);
console.log(j);
// 0, 1, 2, 3, 4, i is not defined, j is not defined
在使用let定义变量后,外面是不能访问for循环里定义的变量的,此时for循环内的变量只能在for循环的块级作用域中访问。