let与const命令

块级作用域——let 声明变量


let和var相同的地方是都可以声明变量,只是声明的范围不一样,let声明的变量只在let所在的代码块内有效。

举栗子

function test1() {

    for (let i = 0; i < 4; i++) {

        let i = 2;
        console.log(i);
    }
}

test1();

猜猜这段代码运行的结果是什么,让我们拭目以待:

let与const命令_第1张图片
let.png

是连续四次输出for语句定义的变量,这充分证明了let定义的变量只在当前模块有效。

function test2() {

    for (var i = 0; i < 4; i++) {

        var i = 3;
        console.log(i);
    }
}

test2();

作为对比来试试var定义的变量:

let与const命令_第2张图片
var.png

let 与var定义变量的区别


1.let不允许变量提升。

console.log(b);
var b = 4;
console.log(a);
let a = 3;

结果显示let报错,var没有报错。


let.png

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();

结果显示:


let与const命令_第3张图片
let.png

3.不允许重复声明

function test1() {
    var a = 10;
    var a = 12;
    console.log(a)
    let b = 1;
    let b = 3;
    console.log(a)
}
test1()

结果:

let与const命令_第4张图片
let.png

a不报错只有b报错。

块级作用域——const声明常量


const

const如果只声明不赋值是报错的。并且赋值之后不可变。
内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。
如下可以对数组进行push操作。

function test2() {
    const a=[];
    a.push(1);
    console.log(a)
}
test2()
const.png

你可能感兴趣的:(let与const命令)