zoukankan      html  css  js  c++  java
  • let 和const

    let 命令

    es6新增了let命令,用于声明变量,与var用法类似,但是使用let声明变量只在它所在的块内有效,而var则是定义的全局变量
    {
        let a=10;
        var b=1;
    }
    a   //a is not defined,外部的a不能访问到上面块中定义的a变量
    b   //1
    

      

    let不存在变量提升提升

    //使用var会发生变量提升,当脚本开始运行使用var命令声明的变量已经存在
    console.log(foo);   //undefined
    var foo=2;
    
    
    console.log(foo);   //报错ReferenceError
    let foo=2;          
    //使用let声明,声明的变量一定要在声明之后使用,否则会报错

    let不允许重复声明

    let不允许在相同作用域内重复声明同一个变量

    //报错
    function(){
        let a=10;
        var a=1;
        //let a=3;
    }

    const命令

    const用于声明常量,并且该常量那个是只读常量,一旦声明该常量就不能被更改

    const a=1;
    a       //1
    a=2;    //报错

    并且const只声明,不赋值也会报错。

    const a;    //报错

    const变量和let一样只能在声明之后使用,并且命令生命的变量也不会提升,同样也不可以重复声明。

    const本质

    const的常量不能够更改实质上并不是变量的额值不能更改,而是变量指向的内存地址不能变动。

    块级作用域

    es5只有全局作用域和函数作用域,但是没有块级作用域。

    没有块级作用域导致的问题

    1. 内层变量可能会覆盖外层变量
    2. 用来计数的循环变量泄露为全局变量
    for(var i=0;i<10;i++){
        console.log(i)
    }
    console.log("外部"+i)
    初出结果:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    外部10
    
    可以看出外部的i会受到循环体中i的影响,如果使用let就会有块级作用域,最后就会显示,外部i不能找到就会报错。
    
    

    es6的块级作用域

    在块级作用域中,外层作用域不能访问内层作用域的变量,,但是内层作用域可以定义外层作用域的同名变量。

    function example(){
        let n=5;
        if(true){
            let n=10;   //内层作用域可以和外层作用域声明同名变量
        }
        console.log(n);     //5,外层作用域不会受到内层作用域的影响
    }

    块级作用域与函数声明

    在es5中规定,函数只能在顶层作用域和函数作用域之中声明,不能再块级作用域中声明。
    但是es6有所改变:

    1. 允许在块级作用域内声明函数
    2. 函数声明允许类似var,会提升到全局作用域或函数作用头部。
    3. 函数声明会提升到块级作用域头部
    4. 但是es6规定,在块级作用域中声明函数类似于let,在块级作用域之外不能引用。
    5. 但是需要避免在块级作用域中声明函数,一定要使用函数表达式形式写,而不是韩红素声明语句
    //函数声明语句
    {
        let a="test"
        function(){
            return a;
        }
    }
    
    
    //函数表达式
    {
        let a="test";
        let f=function(){
            return a;
        };
    }
    //并且块级作用域一定要有大括号,才能声明函数
  • 相关阅读:
    time模块
    大胆想象! 安全设备专有机房建设思路
    自定义了一个email模块,符合大多数人的使用习惯
    meterpreter持久后门
    使用meterpreter让没有安装python解释器的肉鸡设备执行任意python程序
    入侵感知系列之管理后台发现思路
    入侵感知系列之弱口令检测思路
    入侵感知系列之webshell检测思路
    入侵感知系列之反连检测思路
    智能制造=人工智能?别把智能制造神秘化!
  • 原文地址:https://www.cnblogs.com/zzzha/p/9435790.html
Copyright © 2011-2022 走看看