js javascript变量提升

var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部)
let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重复声明(报错has already been declared)
const:无变量提升,声明一个基本类型的时候为常量,不可修改;声明对象可以修改
<script>
    var a = 1;
    function fn() {
        console.log(a)//undefined
        a = 2;
        console.log(a)//2
        var a = 3;
        console.log(a)//3
    }
    /* var声明变量提升到作用域顶部
    fn等价于 
    function fn() {
        var a;
        console.log(a)//undefined
        a = 2;
        console.log(a)
        a = 3;
        console.log(a)
    }
    */

    function fn2() {
        //console.log(a)//a is not defined,let声明之前不能使用
        let a = 4;
        //let a = 5;//a has already been declared,在同一个作用域内let不能重复声明如果{let a=5;}就可以,{}内的let声明作用域只在{}有效
        console.log(a)//4
    }

    function fn3() {
        console.log(a)//1
        a = 6;
    }

    fn();
    fn2();
    fn3();
    console.log(a);//6
</script>

 还有以下例子,可以看出函数也存在提升一说:

<script>
    console.log(fn);//ƒ fn() {}
    var fn = 1;

    function fn() {}

    console.log(fn);//1

    /*函数提升,提升到作用域最前
    等价于
    var fn = undefined;

    function fn() {}

    console.log(fn);
    fn = 1;
    console.log(fn);
    */
</script>

 具体的提升可以参照:https://zhuanlan.zhihu.com/p/28140450

原文地址:https://www.cnblogs.com/lcawen/p/8777630.html