美文网首页
ECMAScript 6

ECMAScript 6

作者: 小超人_ | 来源:发表于2018-12-06 16:24 被阅读1次
    什么是代码块?

    可以这么理解,一个花括号“ { } ”就是一个代码块。用 let 声明的变量,只可以在花括号内部使用。let实际上为 JavaScript 新增了块级作用域。

    在 let 命令声明变量 tmp 之前,都属于变量 tmp 的 “死区”

    在没有 let 之前 typeof 是一个绝对安全的操作,不存在的全局变量直接打出 undefined。如果一个变量根本没有被声明,使用 typeof 反而不会报错。

    typeof tmp;  // ReferenceError
    let tmp;
    typeof undeclared_variable;  // undefined
    
    ES6 规定暂时性死区和 letconst 语句不出现变量提升
    // 不报错
    var x = x;
    
    // 报错
    let x = x;
    // ReferenceError: x is not defined
    

    ES6 规定暂时性死区和letconst语句不出现变量提升,主要是为了减少运行时错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。这样的错误在 ES5 是很常见的,现在有了这种规定,避免此类错误就很容易了。
    总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。


    不允许重复声明

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

    function a () {
      let i = 12;
      var i =13;
    };  //报错
    function b () {
      let i = 0;
      let i = 0;
    };  //报错
    function (res) {
      let res;
    };  //报错
    function (res) {
      {
        let res;
      }
    };  //不报错
    

    块级作用域

    ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。

    • 内层变量可能会覆盖外层变量。
    var tmp = new Date();
    
    function f() {
      console.log(tmp);
      if (false) {
        var tmp = 'hello world';
        // tmp = 'hello word';  此处放开又是另一种效果,一个是变量变量提升,一个是重新赋值,注意区别
      }
    }
    
    f(); // undefined
    

    上面代码的原意是,if 代码块的外部使用外层的 tmp 变量,内部使用内层的 tmp 变量。但是,函数f执行后,输出结果为 undefined,原因在于变量提升,导致内层的 tmp 变量覆盖了外层的 tmp 变量。

    • 用来计数的循环变量泄露为全局变量。
    var s = 'hello';
    
    for (var i = 0; i < s.length; i++) {
      console.log(s[i]);
    }
    
    console.log(i); // 5
    

    上面代码中,变量 i 只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。


    let 实际上为 JavaScript 新增了块级作用域。
    function f1() {
      let n = 5;
      if (true) {
        let n = 10;
        console.log(n); //10
      }
      console.log(n); // 5
    }; 
    

    表面上看声明了两个一样的变量 n ,但是 let 声明变量只在自己的块作用于内生效,所有打出 10 5;

    ES6 允许块级作用域的任意嵌套。
    {{{{let a = 'smile'}}}} //四层的块级作用域
    

    相关文章

      网友评论

          本文标题:ECMAScript 6

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