ES6的let关键字(块级作用域)

自 ECMAScript6 被提出以来(2015 —?)又增加了不少新的特性,其中 let 关键字就是一个不错的尝试。let 关键字的提出表明JavaScript开始正式支持 “块作用域”。

ECMAScript5 以及之前,是没有块作用域这一概念的,在 JavaScript 中只存在两种作用域:

  • 全局作用域
  • 函数作用域

全局作用域和函数作用域,正如其名分别表示声明在函数外和函数内的变量。如今 JS 家族再添新丁,块级作用域被顺利产下。那什么是块级作用域呢?块级作用域是指声明在 “{” 和 “}” 里面的变量,函数不算。

  • 块级作用域
{var a;}  //ES6之前没有let关键字,也就没有块级作用域,加不加括号效果是一样的

现在引入 let 关键字,不同层次的let变量互不干扰,这就叫块级作用域。如下面的代码所示,后解析的 let 变量不会覆盖之前解析出的变量的值。

{
  let a = 1;
  {
    let a = 2;
    console.log(a);  // 2
  }
    console.log(a)  // 1
}

如果你喜欢,还可以嵌套多个块级作用域(强迫症福利~~)

{
  {
    {
      {
        {
          let a = 0;
        }
      }
    }
  }
}

对比下面两段代码

function createFunctionArray() {
    arr = [];
    for(var i = 0; i < 5; i++){
        arr[i] = function () {
            console.log(i);
        }
    }
    return arr;
}
createFunctionArray()[0](); // 5
createFunctionArray()[1](); // 5
createFunctionArray()[2](); // 5
createFunctionArray()[3](); // 5
createFunctionArray()[4](); // 5

使用 let 变量,再也不用担心内层变量泄露为外层变量的问题了

function createFunctionArray() {
    arr = [];
    for(let i = 0; i < 5; i++){
        arr[i] = function () {
            console.log(i);
        }
    }
    return arr;
}
createFunctionArray()[0](); // 0
createFunctionArray()[1](); // 1
createFunctionArray()[2](); // 2
createFunctionArray()[3](); // 3
createFunctionArray()[4](); // 4

不管怎样,你就记着一条:在 JavaScript 中写循环变量务必用 let 进行声明。



顺便一提,Java 也是原生支持块作用域的。虽然二者并没什么联系。

你可能感兴趣的:(JavaScript,语言)