var 与 let 的联系与区别
同:都是用来声明变量
异:var 全局声明,let 局部声明仅在声明的块级作用域内有效
<script type="text/javascript">
{
var a = 1;
let b = 2;
console.log("a0="+a);
console.log("b0="+b);
}
console.log("a="+a);
console.log("b="+b);
</script>
如代码所示最后一个console.log报错,原因:let 局部声明仅在声明的块级作用域内有效
let适用于for循环中
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[2]();
var b = [];
for (let k = 0; k < 10; k++) {
b[k] = function () {
console.log(k);
};
}
b[2]();
原因:
i是var声明的,在全局范围内都有效,console.log(i),里面的i指向的就是全局的i,所以最后输出的是10
k是let声明的,只在本轮循环局部有效,console.log(k),每一次for循环的k都为新变量,所以最后输出的是2。
var 的声明,存在变量提升。
let 的声明,不存在变量提升。
const 的声明,不存在变量提升。
例1:
<script type="text/javascript">
console.log(f1); var f1 = 1;
console.log(f2); let f2 = 2;
</script>
例2:
<script type="text/javascript">
console.log(f1); var f1 = 1;
console.log(f3); let f3= 3;
</script>
let不允许在相同作用域内,重复声明同一变量。
<script type="text/javascript">
function func() {
let a = 1;
var a = 2;
console.log(a)
}
func();
</script>
const声明一只读的常量,声明后值不能进行改变
<script type="text/javascript">
const f1 = 123;
console.log(f1)
f1= 3;
console.log(f1)
</script>
注意事项
- var为全局变量,在for循环中,容易泄露成了全局变量。
- let局部变量
- const常量声明