ES5中只有全局作用域和函数作用域,没有块级作用域,这导致很多场景不合理。
1 内层变量可能会覆盖外层变量。
2 用来计数的循环变量泄露为全局变量(for循环中)
1 内层变量可能会覆盖外层变量。
var s = 'nihao';
function test(){
console.log(s);
if(true){
var s = '你好';
}
}
test(); //undefined
上面表示if代码块外部使用了外部的变量s,内部使用了内部变量i,但是在执行test函数时发生变量提升,导致内部的变量s覆盖了外部变量s,使得执行结果为undefined
2 用来计数的循环变量泄露为全局变量(for循环中)
var s =[1,2,3,4,5];
for(var i=0; i<s.length; i++){
console.log(s[i]);// 1 2 3 4 5
}
console.log(i); //5
上面代码表示在for循环时用var定义的变量i使得在循环结束后i并没有消失,而是暴露成为了全局变量,所以最后打印的时候i为5。
ES6中引入了let和const实现了块级作用域
块级作用域只在该作用域内有效,不会污染全局变量
var s;
if(true){
let s = 1;
}
console.log(s) //undefined
块级作用域使for循环不会被影响
for(let i=0; i < 5; i++){
console.log(i)
}
console.log(i) //ReferenceError: i is not defined