<h3>块级作用域——let 声明变量</h3>
let和var相同的地方是都可以声明变量,只是声明的范围不一样,let声明的变量只在let所在的代码块内有效。
<h3>举栗子</h3>
function test1() {
for (let i = 0; i < 4; i++) {
let i = 2;
console.log(i);
}
}
test1();
猜猜这段代码运行的结果是什么,让我们拭目以待:
是连续四次输出for语句定义的变量,这充分证明了let定义的变量只在当前模块有效。
function test2() {
for (var i = 0; i < 4; i++) {
var i = 3;
console.log(i);
}
}
test2();
作为对比来试试var定义的变量:
<h4>let 与var定义变量的区别</h4>
1.let不允许变量提升。
console.log(b);
var b = 4;
console.log(a);
let a = 3;
结果显示let报错,var没有报错。
2.暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
function test() {
var a, b;
let c, d;
if (true) {
a = 1;
var a;
console.log(a)
}
if (true) {
b = 1;
console.log(b)
}
if (true) {
d = 1;
console.log(d)
}
if (true) {
c = 1;
let c;
console.log(c)
}
}
test();
结果显示:
3.不允许重复声明
function test1() {
var a = 10;
var a = 12;
console.log(a)
let b = 1;
let b = 3;
console.log(a)
}
test1()
结果:
a不报错只有b报错。
<h3>块级作用域——const声明常量</h3>
const如果只声明不赋值是报错的。并且赋值之后不可变。
内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
如下可以对数组进行push操作。
function test2() {
const a=[];
a.push(1);
console.log(a)
}
test2()