zoukankan      html  css  js  c++  java
  • 【ES6】let 命令

    let命令

    为es6新增命令,用来声明变量,类似于var,但是let所声明的变量,只在let命令所在的块级作用域内有效

    块级作用域写法(ES6块级作用域允许任意嵌套):

    // 块级作用域写法
    {
      let tmp = ...;
      ...
    }

    块级作用域例1

    for (let i = 0; i < 10; i++) {
      // ...
    }
    
    console.log(i);
    //ReferenceError: i is not defined

    解析:上面代码中,i作用域for循环体内,在循环体外引用就会报错。

    块级作用域例2

    function f1() {
      let n = 5;
      if (true) {
        let n = 10;
      }
      return n 
    }
    console.log(f1())//5

    解析:栗子说明,外层代码块不受内层代码块的影响。

     

    ---------------------------------------------------------------------------------------------------------------------------------

    let与var的区别

    1.var 没有块级作用域,let有块级作用域

    var实例

    var a = [];
    for (var i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6](); // 10

    分析:代码中,i全局范围内有效,所以全局只要一个变量i。每一次循环,变量i的值都会发生变化,而数组a函数内部的console.log(i),里面的i和全局i为同一个。

    let实例

    var a = [];
    for (let i = 0; i < 10; i++) {
     a[i]
    = function () { console.log(i); }; } a[6](); // 6

    分析:代码中的i使用let声明的,只在本轮循环有效,每一次循环的i其实都是一个新的变量(why?javascript引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算)

    另外,for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域

    for (let i = 0; i < 3; i++) {
      let i = 'abc';
      console.log(i);
    }

    2.var 存在变量提升let不存在变量提升("变量提升"是指变量可以在声明之前使用,值为undefined·)

    例:

    / var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;

     3.let暂时性死区

    只要块级作用域内存在let命令,它所声明的变量的作用域就是这个区域,

    例如

    var tmp = 123;
    
    if (true) {
      tmp = 'abc'; // ReferenceError
      let tmp;
    }

    解析:tmp的作用域为块级作用域,报错原因:未声明直接使用,

    4.let不允许重复声明

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

    例子

    // 报错 Uncaught SyntaxError: Identifier 'a' has already been declared
    function func() {
      let a = 10;
      var a = 1;
    }
    
    // 报错
    function func() {
      let a = 10;
      let a = 1;
    }

    扩展:不能在函数内部重新声明参数

    function func(arg) {
      let arg; // 报错,相同的作用域内
    }
    
    function func(arg) {
      {
        let arg; // 不报错 函数参数arg 和此处的arg不在同一个作用域内
      }
    }

     总结:

    1.let命令有块级作用域
    2.let命令先声明再使用
    3.let命令不可重复声明(同一作用域)

    相关资料:http://es6.ruanyifeng.com/#docs/let

    作者:smile.轉角

    QQ:493177502

  • 相关阅读:
    猜数游戏
    计算数组长度
    python 将IP地址转换成打包后的32位格式
    nutch-2.2.1 hadoop-1.2.1 hbase-0.92.1 集群部署
    Julien Nioche谈Apache Nutch 2的特性及产品路线图
    一次心惊肉跳的服务器误删文件的恢复过程
    Http长连接200万尝试及调优
    zookeeper 系列
    Enhancing the Scalability of Memcached
    linux杂谈(十八):DNS服务器的配置(一)
  • 原文地址:https://www.cnblogs.com/websmile/p/8330320.html
Copyright © 2011-2022 走看看