js高阶——let、const、var

let和const

        对象放入堆内存,栈内存放引入地址。

        es5中,使用var定义变量,es5中没有常量的概念只有变量,在大型程序中经常需要设置一些

        常量,通常变量名称以_(下划线)开头的变量,认为规定他为常量

        es6中,使用新的let和const替代var定义变量。let用来定义变量,const用来定义常量

        在es6中常量是指:值不能改变的变量。

        const定义的常量必须初始化,初始化 = 赋值。

                const a = 123;

                a = 456;//报错,常量不能改变

                const x;//常量在定义时就必须赋值,否则就会报错

                

                const x = {

                        a:1,

                        b:2,

                }

                x.a = 123;//正确

                x = {a:1,b:2};//报错

                console.log(x)//常量只是规定值不能被再次赋值,如果值是引用类型,则只要指针不

                                                变,就不算值变化

暂时性死区

        变量声明提升

                在执行上下文的创建阶段,要确定变量(不赋值);

                console.log(a)

                var a = 123;

                提升为

                var a;

                console.log(a)

                a = 123;

                确定变量时,执行上下文会将当前作用域内的代码中的变量声明提升到最开始来执行,

                这个现象就叫做变量声明提升。

                console.log(x)

                var x = 123;

                var x = 456;

                var x = 789;

                es5中,多次重复定义同一个而变了不会报错,实际运行结果为:

                var x;

                console.log(x)

                x = 789;

        不能重复定义(TDZ)

                console.log(x);

                let x = 1;//报错

                

                es6中,不存在变量声明提升。

                在es6中,在当前作用域内,如果有定义局部变量x,那么这条定义会使得之前的语句都

                不能访问

                局部变量x,相当于let x;他会锁死之前语句访问x的权限。

                暂时性死区:在当前作用域内,如果一条语句定义了变量x,那么这条语句之前的所有

                其他语句都不能访问这个变量x(锁死),知道遇到这条语句才会解除锁死。被锁死的

                区域就叫做暂时性死区。

        

                因为有暂时性死区的存在,所以在es6中,变量或常量不能重复定义。

                        console.log(x);

                        let x = 1;

                        let x = 2;//报错

                        let x = 3;

                        因为let x = 1;处于let x = 2形成的死区中。

        let、const、var的区别

                es中所有声明的全局变量,window.x都可以访问的到

                1、var是允许重复声明的,let,const不允许

                2、var存在变量声明提升,let,const不存在

                3、let、const有暂时性死区,而var没有

                4、在全局作用域中,通过var声明的变量和通过function声明的函数,会自动变成

                window对象的属性或者方法,而let或const有暂时性死区,而var没有。

                        var alert = 4//es5中全局定义的变量会自动附加到window对象上

                        相当于window.alert = 4;

                        可以在任何地方用window. 访问全局定义的变量和函数。

                        window.alert();//报错

                        fn();

                        function fn(){

                                console.dir(window.alert);//4

                                console.dir(alert);//undefined

                                var alert = 456;

                        }

                5、var没有块级作用域

                        var x = 123;

                        aa();

                        function aa(){

                                var x = 123;

                                aa();

                                function aa(){

                                        var x = 456;

                                        console.log(window.x)//123

                                }

                        }

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

                        }

                        console.log(i)//10

                        for(let i = 0; i < 10; i++){}

                        console.log(i)//not defined

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值