参考书《ECMAScript 6入门》
http://es6.ruanyifeng.com/

let和const命令

let 总结
1.声明变量基本使用方法与var 相同
  不同点
  a.在代码块中使用let声明的变量只在代码块中有效,代码块外无法访问,而用var声明的在代码块外也可以访问。可以利用这点声明局部变量,也可用它解决js中的for循环闭包的问题
 
  ****闭包的解释****
 
  function out(){//外部函数
    var arr = [];
    for(var i = 0; i < 3; i ++){
        arr[i] = function(){//匿名函数
            console.log(i);
        }
    }
    return arr;
  }
 
  out()[0]();
 
  期待结果 0
  实际结果 2
 
  造成结果偏差的原因就是闭包
 
  闭包的定义:有权访问另一个函数作用域中的变量的函数
 
  在此例子中,函数out内部创建了另外一个匿名函数,并且这个匿名函数可以访问out的变量i,这就形成了闭包(实现了匿名函数有权访问out的作用域中的变量)
 
  解决闭包的方法
 
  M1.匿名函数自执行传参
  function out(){//外部函数
    var arr = [];
    for(var i = 0; i < 3; i ++){
        arr[i] = (function(number){//匿名函数
           console.log(number);
        })(i);
        //使用()()利用匿名函数自执行的方式将参数传递给匿名函数使用
        //这里每循环执行一次i,i就会作为参数进行匿名函数自执行,然后最终结果就是0,1,2
    }
    return arr;
  }
  out();//0,1,2
  M2.将参数传给匿名函数的变量
  function out(){//外部函数
    var arr = [];
    for(var i = 0; i < 3; i ++){
        arr[i] = function(number){//匿名函数
           console.log(number);
        }(i)//和(function(){})()是一个意思,都是告诉浏览器自动运行这个匿名函数,这时将参数传给匿名函数的参数,可以不用加()
    }
    return arr;
  }
  out();//0,1,2
  M3.let 定义块级作用域变量的方式
  function out(){//外部函数
    var arr = [];
    for(let i = 0; i < 3; i ++){
        arr[i] = function(){//匿名函数
           console.log(i);
        }
    }//let声明的变量是块级作用域变量,每次循环都生成一个新的变量i,所以console.log(i) 也只能返回for循环内部的每次i,无法像var 定义的一样返回访问全局的i
   return arr;
  }
  out()[0]();//0
 
  b. let 不支持变量提升
 
  console.log(a); //会报ReferenceError错误,表示不存在这个变量。在代码块中,使用let/const声明变量前,变量都是不可用的,称为“暂时性死区”
  a = 23;//ReferenceError
  typeof a;//ReferenceError
  let c = c;//ReferenceError  c还没有完成变量声明,不可以用来赋值
  function test(x = y,y = 2){return x+y};//ReferenceError: y is not defined   在给x赋值y时,y还没有声明
  //暂时性死区本质:在块级作用域里,变量只有等到声明变量的那一行代码出现时,才可以赋值和使用,不然都会报错
  let a = 9;  
 
  console.log(b);//undefined 当用var声明变量时,浏览器运行时会先声明这个变量b,但是b没有赋值,就输出undfined
  var b = 9;
 
  c.let不支持重复声明变量
 
  funtion test(){var a = 1;var a = 2;}
  test();//不报错 undefined
 
  funtion test(){let a = 1;var a = 2;}
  test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
 
  funtion test(){var a = 1;let a = 2;}
  test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
 
  funtion test(){let a = 1;let a = 2;}
  test();//报错 Uncaught SyntaxError: Identifier 'c' has already been declared
 
  function action(event){let event = event || window.event}
  action();//Uncaught SyntaxError: Identifier 'event' has already been declared
 
  function action(event){var event = event || window.event}
  action();//不报错
 
2. let命令声明了js的块级作用域

var a = 1;
function test(){
  console.log(a);//undefined  此处发生了变量提升,这里的a指的是if中的那个a
  if(true){
     var a = 3;
  }
  console.log(a);//3  此处的a是if中重新声明赋值的a
}

let b = 1;
function test(){
  console.log(b);//1 第一个let作用域内的b
  if(true){
     let b = 3;
  }
  console.log(b);//1  第一个let作用域内的b
}

立即执行函数等同于let块级作用域
(function(){var c = ..........;}())------------{ let c = ......;}

es6可以在块级代码中声明函数

if(true){
  function test(){}//函数声明语句
}

if(true){
 let c = function(){}//函数表达式
}

const 总结
1.声明常量,声明的同时就要赋值,且不允许再被改变
const NATURE = 3//ok
const NATURE1;//报错Uncaught SyntaxError: Missing initializer in const declaration,必须声明的同时赋值

2.块级作用域,不支持变量提升,暂时性死区,同一作用域内不允许重复声明变量与let一致

const obj = {}
obj.name = '123'//ok 给对象增加属性属于对象obj的功能
obj = {"name" : "123"};//报错 常量obj不可以重新赋值

小结:ES6是ES5的升级版
      ES5有两种声明变量的方法:var,function
      ES6有六种声明变量的方法:var,function,let,const,import,class

ES6学习笔记(1)----let和const命令的更多相关文章

  1. es6学习笔记1 --let以及const

    let语句的基本用法:  1.let声明的变量为块级作用域,只在最近的{}里面有效,如果在外部引用就会报错. { let a = 10; var b = "hello" } ale ...

  2. ES6学习笔记(一)——let和const

    1.ES6学习之let.const (1).var.let.const 变(常)量声明 ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景. 在ES6中let就诞生了,实际上它 ...

  3. ES6学习笔记之 let与const

    在js中,定义变量时要使用var操作符,但是var有许多的缺点,如:一个变量可以重复声明.没有块级作用域.不能限制修改等. //缺点1:变量可以重复声明 var a=1; var a=2; conso ...

  4. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  5. ES6 学习笔记(一)let、const与作用域

    一.let命令 1.1用法 1.1.1 let类似于var,但所声明的变量只在let命令所在的代码块有效. 如: { let a = 10 var b = 20 } console.log(b) co ...

  6. es6学习笔记-class之一概念

    前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...

  7. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  8. JS&ES6学习笔记(持续更新)

    ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...

  9. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

随机推荐

  1. Qt学习--初学注意事项

    过程.心得: 1)Qt Creator与相关的安装包的安装 我在选择去学习Qt之后,第一件事就是Qt SDK下载安装与配置.最初,在网上发现Qt使用的IDE环境        在Windows上可以选 ...

  2. ie6不支持png图片的解决办法

    在head里引入png.js文件 <!--[if lte IE 6]> <script type="text/javascript" src="js/P ...

  3. Linux设备驱动--块设备(二)之相关结构体

    上回最后面介绍了相关数据结构,下面再详细介绍 块设备对象结构 block_device 内核用结构block_device实例代表一个块设备对象,如:整个硬盘或特定分区.如果该结构代表一个分区,则其成 ...

  4. git 如何让单个文件回退到指定的版本【转】

    本文转载自:http://blog.csdn.net/ikscher/article/details/43851643 1.进入到文件所在文件目录,或者能找到文件的路径查看文件的修改记录 1 $ gi ...

  5. Persisting Data to the Device

    Persisting Data to the Device Edit PagePage History Overview The Android framework offers several op ...

  6. Masonry remake更新约束

    前言 说到iOS自动布局,有很多的解决办法.有的人使用xib/storyboard自动布局,也有人使用frame来适配.对于前者,笔者并不喜欢,也不支持.对于后者,更是麻烦,到处计算高度.宽度等,千万 ...

  7. bzoj1933

    背包dp 一道很早以前就见过的dp dp[i][j][k]表示选到第i本书,第一层宽度为j,第二层宽度为k的最小高度,我们先把书按高度排序,然后转移就很方便了,因为高度降序,所以后选的书不影响之前选的 ...

  8. asp.net mvc5 使用百度ueditor 本编辑器完整示例(三)在IIS中多个应用程序使用多个ueditor对象

    最近做了一个项目,要求同一类型的多个专业应用程序(网站),但是每个应用程序都需要调用各自当中的ueditor. 步骤: 一.在vs2013中设置每个专业的asp.net mvc 应用程序. 1.配置根 ...

  9. bzoj 4320: ShangHai2006 Homework【分块】

    按根号300000=m分情况讨论 查询是,当x小于等于m,那么可以暴力记录直接出解:否则,用分块维护区间值,查询的时候以x为步长跳根号m次取最小值即可 还有一种并查集方法,来自https://www. ...

  10. bzoj 1880: [Sdoi2009]Elaxia的路线【spfa+拓扑排序】

    有趣啊 先spfa分别求出以s1,t1,s2,t2为起点的最短路,然后把在s1-->t1或者s2-->t2最短路上的边重新建有向图,跑拓扑最长路即可 #include<iostrea ...