有时候当我们用var定义变量的时候,时常要注意变量的作用区间,经常一不小心没注意就会出现错误,换成let定义的时候,就不会担心变量跨作用域。
例如: i的变量泄露
for(var i = 0 ; i<5 ; i++){
console.log(i);
}
console.log("最后i的值"+i)
此时i循环了五次,输出,可是外面的i的值也同样发生了改变。但是,如果采用let定义变量的话,那么最后输出i的时候会报错,会报出i未定义。
let const 和var 的区别
① var定义的变量是全局变量,也是window属性下的变量。而let,const定义的变量是块级作用域的,即变量只能在定义它的最小的代码块里面使用,这也是为什么上面循环后最后输出i的值会报错的原因。
② var存在变量提升,而let ,const定义不存在变量提升。也就是说,let,const一定要将变量先定义,才能使用,不然会报错。
var a = "你好"; // 如果将var 换成let 则输出为你好
function fn() {
//使用a 查看函数内部有没有定义a
console.log(a); //输出undefined
if (false) {
var a = "小明"; //变量提升
}
}
fn();
函数fn()里面var a = “小明” 即使没执行,但是也会变量提升,就是将var a 在函数fn 里面第一句就执行,所以此时输出a是未定义 。如果将外面的var 换为let ,则输出你好。
③ let,const在一个代码块里面只能定义同一变量一次,而var 可以在一个代码块里面重复定义变量,重复赋值。
④ var 子作用域定义了 父作用域可以用 let 子作用域定义的 父作用域用不了
for(var i = 0 ; i<5 ; i++){
var i = 10;
console.log(i); //循环一次 输出10
}
for(let i = 0 ; i<5 ; i++){
let i = 10;
console.log(i); //循环十次 输出10 里面的i和for循环里面的i不是在同一个作用域
}
let定义变量可以减去ES5 var定义带来的诸多麻烦。