在ES5中
在ES5中,只有全局作用域和函数作用域,没有块级作用域,可以用其他方法来实现块级作用域:
(function(){
for(var i =0;i<10;i++){
}
})()
console.log(i) // i is not defined
这种写法叫立即执行函数,这样就创建了一个块级作用域,在该作用域声明的变量不会被外部访问到,这样就不会污染全局变量。
ES5中变量提升
变量提升只是将变量声明提升到作用域最前,但是变量赋值还是在原位置。例如:
var a = 10;
(function(){
console.log(a);
var a = 1;
})()
等同于
var a = 10;
(function(){
var a;
console.log(a);
a = 1;
})()
结果是undefined
在ES6中
在ES6中,为了解决ES5存在的诸多问题,用let替代了var来声明变量。
let为ES6提供了新的作用域——块级作用域,例如:
for(let b = 0; b < 10; b ++){
}
console.log(b) // b is not defined