美文网首页
const声明变量

const声明变量

作者: 他在发呆 | 来源:发表于2016-11-19 15:15 被阅读0次

    const声明一个只读的常量,即常量的值不能被改变,如果改变就会报错

         const a=10;
         a=100;//报错
    
    • 作用域:与let命令相同,只在声明所在的块级作用域内有效
        // if(true){
        //  const foo=5;
        // }
        // console.log(foo);//报错
    
    • 同样不能提升,存在暂时性死区,只能在声明的位置后面使用
        // if(true){
            // console.log(foo);
            // const foo=5;
        // }
    
    • 不能重复声明,同let
        // const foo={};
        // foo.prop=123;
        // console.log(foo.prop);//123
        // foo={};//报错
        // 对象本身是可变的,依然可以为其添加新属性。但是不能重新赋值
    

    冻结对象的方法

    const foo=Object.freeze({});
    foo.prop=123;//在常规模式下,不起作用,严格模式报错。
    
    • 除了冻结对象本身,对象的属性也可以冻结
        var constantize=(obj)=>{
            Object.freeze(obj);//冻结obj
            Object.keys(obj).forEach((key,value)=>{
                if(typeof obj[key]==='object'){
                    constantize(obj[key]);
                }
            })
        }
    

    ES6中声明变量的方法:var function const let class import;

    顶层对象

    在浏览器指window对象,在node指的是global对象,ES5中顶层对象的属性与全局变量是等价的

    顶层对象的属性与全局变量挂钩,被认为是JavaScript语言最大的设计败笔之一。这样的设计带来了几个很大的问题,首先是没法在编译时就报出变量未声明的错误,只有运行时才能知道(因为全局变量可能是顶层对象的属性创造的,而属性的创造是动态的);其次,程序员很容易不知不觉地就创建了全局变量(比如打字出错);最后,顶层对象的属性是到处可以读写的,这非常不利于模块化编程。另一方面,window对象有实体含义,指的是浏览器的窗口对象,顶层对象是一个有实体含义的对象,也是不合适的。
    ES6为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。

        // var a=1;
        // 若在node的repl环境中,可也写成global.a
        //通用的this.a
        // console.log(window.a);//1
    
        // let b=1;
        // console.log(window.b);//undefined
    

    同一段代码,若想拿到顶层对象,一般我们会想到用this方法,但是它是有局限性的
    全局环境中,this.会返回顶层对象,但是node和ES6返回当前所在模块

        // (function (){
        //  console.log(this)//window,在严格模式下会报错
        // }())
    

    若非要获取的话,引用system.global库拿到global;保证在各种环境下global对象都是存在的

        require('system.global/shim')();
    

    ES6写法

        import shim form 'system.global/shim';shim();
    

    相关文章

      网友评论

          本文标题:const声明变量

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