美文网首页
javascript碎片知识000

javascript碎片知识000

作者: 张贪财 | 来源:发表于2019-03-27 11:29 被阅读0次

    const let var 3者的区别。

    const 和 let 为es6新增的定义变量的关键字。

    var存在的问题:

    1 作用域问题:

    首先以一个for循环代码块来说明:

    for (var i = 0; i < 10; ++i) {
        console.log(i); //1
    }
    console.log(i); //2
    

    用var 来定义计算器i的话 在代码标记2处也能成功输出,这说明变量i的作用域超出了for循环代码块,而我们预期的结果应该是变量i应当只作用于for循环内部。

    2 重复定义问题:

    首先看一下以下代码块:

    var num = 16;
    var num = 6;
    console.log(num); //结果为6
    

    上示代码中num重复定义但是没有报错,num被复写。而为了代码规范和安全在同一作用域内重复定义num应当报错或警告提示。

    3 延时使用变量延时过程中变量被改变问题:

    for (var i = 0; i < 3; i++) {
        setTimeout(function () {
            console.log(i)
        }, 1000);
    }
    

    上述代码中输出结果为3,3,3,期望结果1,2,3。

    4 变量提升:

    console.log(i);
    var i;
    

    var定义的变量会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。我们期望应该是在变量定义前使用该变量应该是禁止的。

    es6语法新增let解决上述var存在的问题:

    let的特性1:

    let 所声明的变量,只在该变量所在的代码块内有效。
    这个特性很好的解决了上述的var存在的问题1和问题3.

    let的特性2:

    let 所声明的变量一定要在声明后使用,否则报错。
    ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。总之,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
    这个特性很好的解决了var的问题4。

    let 的特性3:

    let 所声明的变量不能在同一作用域做两次声明 会出现报错。
    解决var问题2。

    es6语法新增关键字const的用法:

    const 的特性1:

    const声明一个只读的常量。一旦声明,常量的值就不能改变。
    这个特性决定了const声明的变量必须在声明的时候赋值。

    除了特性1外其他特性都与let一致。

    相关文章

      网友评论

          本文标题:javascript碎片知识000

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