js中的变量提升

/**

     * js中变量声明未赋值 结果是undefined  

     * js中没有声明变量  结果报错

     * js中的就近原则

     * var定义的是函数作用域 有变量提升的作用

     * 没有限定符修饰的,是绑定在window上的,是全局作用域  没有变量提升作用

     * 

     * */

    // 情景1  

    console.log(a) //undefined   

    var a = 'a'

    // 以上等价下面方式  变量声明为赋值

    var a;

    console.log(a)

    a = 'a'

    // 情景2  作用域内的变量提升

    function test() {

        console.log(a)//undefined   

        var a = "abcd";

        console.log(a) //abcd   

    };

    test()

    // 以上等价下面方式  变量声明为赋值

    function test() {

        var a;

        console.log(a)

        var a = "abcd";

        console.log(a)

    };

    test()

    //情景3 就近原则

    var a = 'bcd'

    function test() {

        console.log(a)//undefined   

        var a = "eeeee";

        console.log(a) //eeeee   

    };

    test()

    //情景4  直接定义a 此时a 是没有作用域的此时a 不存在变量的提升

    // 第一个打印报错 a is not defined  后面一个打印不会执行 

    // js代码时按照顺序执行的,前面代码报错后,后面代码都不会执行

    function test() {

        console.log(a); //报错,a is not defined

        a = "abcd";

        console.log(a)

    };

    test();

    // 情景4 

    function test() {

        a = "eee";

        console.log(a); //eee

    };

    test();

    console.log(window.a); // eee

    function test() {

        var a = "abcd";

        console.log(a);//abcd

    };

    test();

    console.log(window.a); //undefined


    /**

     *js中方法的提升  方法>变量

     * js中的方法是整体提升到顶部的

     * 

     * */ 

    // 情景1

    console.log(a);    // f a() {return 10;}

    console.log(a());    //  10

    var a = 3;

    console.log(a)   //3

    function a() {

        return 10;

    }

    // 以上等价于下面的情况

    function a() {

        return 10;

    }

    var a

    console.log(a);    // f a() {return 10;}

    console.log(a());    //  10

    a = 3;

    console.log(a)   //3

    // 情景2

    a(); //a is not a function

    var a = function () {

        console.log("abcd");

    };

    // 此时的a是定义了一个变量不是一个方法,执行a()就会报错

    // 以上等价一下

    var a;

    a()

    a = function(){

        console.log("abcd");

    }

    // 情景3 //js中的方法整体提示到顶部

    a()//abcd

    function a(){

        console.log("abcd");

    }

    // 变量i是var定义的属于全局变量,只有一个变量i,函数内的i指向的也是全局的变量i

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

        document.addEventListener('click',function(){

            console.log(i)

        })

    }

    // 结果  3 3 3

    // let仅在块级作用域for循环内有效,不是全局的,三次循环产生三个数值

    // 这样导致每次函数指向自己对应的值

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

        document.addEventListener('click',function(){

            console.log(i)

        })

    }

    // 结果 0 1 2

    /**

     * var 和 let的区别  

     * 

     * */

    // 1 let不存在变量的提升

    // 2 let存在暂时性死区

    // 3 不允许重复声明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。