美文网首页
js 变量提升(3)

js 变量提升(3)

作者: 路上灵魂的自由者 | 来源:发表于2019-01-17 18:01 被阅读13次

    ### ES6中let创建的变量不存在变量提升

    /*

    * 在ES6中基于let或者CONST等方式创建变量或者函数,不存在变量提升机制

    *

    * -> 切断了全局变量与WINDOW属性的映射机制

    * ->在相同的作用域中,基于LET不能声明相同名字的变量(不管用什么方式在当前作用域下声明了变量,再次使用let创建都会报错)

    * -> 虽然没有变量提升机制,但是在当前作用域代码自上而下执行之前,浏览器会做一件重复性检测,自上而下查找当前作用域下所有变量,一旦发现重复的,直接抛出异常,代码也不会执行了(虽然没有把变量提前声明定义,但是浏览器已经记住了当前作用域下有那些变量)

    * /


    /*

    console.log(a)  //a is not defined

    let a = 12;

    let fn = () => {};

    console.log(window.a)  // undefined

    console.log(a)

    */


    /*

    let a = 12;  // Identifier 'a' has already been declared

    var a = 13;

    console.log(a);

    */


    /*

    虽然没有把变量提前声明定义,但是浏览器已经记住了当前作用域下有那些变量(重复检测)

    a = 12;      //a is not defined;

    console.log(a);

    let a = 13;

    comsole.log(a);

    */


    let a = 10,b = 10;

    let fn = function () {

        //console.log(a,b)  // a is not defined

        let a = b = 20;

    //      * let a = 10

    //      * b = 20  // =》 把全局中的b=20

         console.log(a,b)  // 20,20

    }

     fn()

    console.log(a,b) // 10,20

    ### js 暂时性死区

    var a = 12;

    var b = 13;

    if(true){

        console.log(a);//a is not defined

        let a = 13;  //基于let创建变量,会把大部分{}当做一个私有的块级作用域(类似于函数的私有作用域),在这里也是重新检测语法和规范,看一下式否式基于新语法创建的变量,如果是按照新语法规范来解析

        console.log(b) //13

    }


    /*

    老版本 - 没有声明,不会报错

    console.log(typeof a);  // "undefined",在原有浏览器渲染机制下,基于typeof等逻辑运算符检测一个未声明过的变量,不会报错,返回UNDEFINED

    */


    /*

    es6解决了暂时性死区的问题

    console.log(typeof a) // a is not defined

    let a;  //=> 如果当前变量是基于es6语法创建的,在没有声明这个变量的时候,使用typeof检测会直接报错,不会是undefined,解决了原有的js死区

    */

    相关文章

      网友评论

          本文标题:js 变量提升(3)

          本文链接:https://www.haomeiwen.com/subject/ltxwdqtx.html