当浏览器开辟出宫代码执行的占内存后,代码并没有自上而言下立即执行,而是继续做了一些事情: 把当前作用域中所有带var funcion 关键字的进行提前声明和定义=>变量提升机制

    • 带 var 的只是提前声明 var a 如果只声明并没有赋值,默认为undefined
    • 带function 的不仅是声明,而且还定义了 a = 13定义其实就是赋值,准确来说就是让变量和某个值进行关联

    1.let const 不存在变量提升机制
    创建变量的种方式中,var function 有变量提升,而 let const import class 不存在这个机制
    2.var 运行重复声明(或执行上下文中)
    在相同的作用域中或执行上下文中 如果使用var function 关键词声明变量并且重复声明,是不会影响的 ,但是使用let const 就不行,浏览器会效验当前作用域中是否已经存在这个变量了,如果已经存在了,则再次基于let 重新声明就会报错
    (在浏览器开辟占内存供代码自上而下执行之前,不仅有变量提升的操作,还有很多其他的操作,如词法解析或者词法检测,如果发现错误,则所有代码不执行
    3.let 可以解决typeof坚持时出现的暂时性死区问题

    1. let a = 12;
    2. function fn() {
    3. console.log(a); // uncaught referenceError:cannot access 'a' before initialization
    4. let a =13; //词法解析,类似于变量提升,已经知道了当前私有栈中有个 Let a ,此时的私有栈中出现的A都是私有的形参赋值&变量提升
    5. }
    6. fn();
    7. console.log(a) //12
    8. // 在当前作用域下,如果创建变量,使用的是let const,一定不能再创建代码前面使用这些变量,否则报错referenceError:cannot access 'a' before initialization

    Let

    1. // let 所在的大括号是一个块作用域(私有作用域)
    2. if(1===1) {
    3. var a= 12;
    4. let b = 13; //有块级作用域。私有块
    5. }
    6. ]
    7. console.log(a)
    8. console.log(b) //b is noe defined

    let具有块级作用域还体现在

    1. let n =12;
    2. function fn() {
    3. if(1) {
    4. let n = 123
    5. console.log(n)
    6. }
    7. console.log(n) //12
    8. }
    9. fn()

    当大括号包裹变量时,外部是无法访问到大括号内部的变量信息的