▓▓▓▓▓▓ 大致介绍

  ES6是下一代的JavaScript语言的标准,目标是让JavaScript可以用来编写大型的复杂程序,成为企业级开发语言,要查看浏览器对ES6的支持程度可以用阮一峰大佬写的工具ES-Checker

  安装:(需要安装npm(心累),推荐用cnpm)

    npm install -g es-checker
    es-checker

  效果(有具体的支持情况):

▓▓▓▓▓▓ let

  let命令,和var的作用一样,都是用来声明变量,只是let命令只在所在的代码块内有效

  经典的例子:

        var a = [];

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

  经典的例子,就不赘述,这里a数组都是引用的同一个i

  改用 let:

        var a = [];

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

  这里i用let声明,就只在本次循环中存在,每次循环都会创建一个i

  注意:在for循环中,循环语句是一个作用域,而循环体内部又是一个子作用域
  例如:

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

  可以看出循环体内的i和循环语句中的i是分离的

▓▓▓▓▓▓ let的特点

  1、不存在变量提升

        console.log(a); //undefined
var a = '123'; console.log(b);
let b = '123'; //ReferenceError: b is not defined

  

  

  2、暂时性死区
  如果在一个块级作用域内有let命令,那他声明的变量就绑定这个块级作用域,不受外部的影响

        var a = '123';

        if(true){
a = '456';
console.log(a); //ReferenceError: a is not defined let a;
console.log(a); //undefined
}

  

  ES6明确规定,如果区块中存在let或者const命令,这个区块对这些命令声明的变量,从一开始就形成封闭作用域,凡是在声明之前使用这些变量都会报错

  这里a是用let声明的,所以在let声明之前使用a都会报错

  3、不能重复声明

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

        //报错
{
var a = '123';
let a = '456';
} //报错
{
let a = '123';
var a = '456';
} //报错
{
let a = '123';
let a = '123';
}

  注意:在函数内不能重复声明参数

                //报错
function test(target) {
let target;
} //不报错
function test(target){
{
let target;
}
}

   在第二个函数里不报错,是应为{}中时一个新的子作用域,和参数target不是在同一个块内了

▓▓▓▓▓▓ 块级作用域

  let为JavaScript新增了块级作用域

  使用var是没有块作用域概念的

        var a = '123';

        if(true){
var a = '456';
} console.log(a); //

  

  使用let就有了块作用域

        let a = '123';

        if(true){
let a = '456';
} console.log(a); //

  外层的代码块不受内层代码块的影响

▓▓▓▓▓▓ 块级作用域和函数声明

  ES5规定函数只能在顶层作用域和函数作用域中声明,不能在块作用域中声明
  ES6 引入了块级作用域,明确允许在块级作用域之中声明函数。ES6 规定,块级作用域之中,函数声明语句的行为类似于let,在块级作用域之外不可引用。
  例如:

            function f(){
console.log('out');
} (function(){ if(false){
function f(){
console.log('in')
};
}; f(); }());

  在ES5中结果是 'in'。就是函数声明提升,不在多赘述
  在ES6中,理想的结果是'out',但是在浏览器中运行时,却会报错,这是为什么?因为如果这么突兀,那么老的代码就会出现很多的问题,所以,ES6规定浏览器可以有自己的的行为方式
    1、允许在块级作用域内声明函数。
    2、函数声明类似于var,即会提升到全局作用域或函数作用域的头部。
    3、同时,函数声明还会提升到所在的块级作用域的头部。

  注意,上面三条规则只对 ES6 的浏览器实现有效,其他环境的实现不用遵守,还是将块级作用域的函数声明当作let处理。

  在ES6中实际执行的代码是

        function f(){
console.log('out');
} (function(){ var f = undefined; if(false){
function f(){
console.log('in')
};
}; f(); }());

  注意:ES6 的块级作用域允许声明函数的规则,只在使用大括号的情况下成立,如果没有使用大括号,就会报错。

            // 不报错
'use strict';
if (true) {
function f() {}
} // 报错
'use strict';
if (true)
function f() {}

▓▓▓▓▓▓ const命令

  const声明一个只读的常量,一旦声明,常量的值就不能改变。所以在使用const时,一旦声明就要立即初始化
  const和let一样,只存在与本块作用域中没有声明提升存在暂时性死区不可重复声明

  const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

  例如:

        const a = {
id: 1,
name:'qqqq'
};
a.id = 2; a = {}; //报错

  参考资料: 

        ECMAScript 6入门-阮一峰

ECMAScript6-let和const命令的更多相关文章

  1. ECMAScript6 入门-let与const命令

    块级作用域 1:let命令声明的变量只在let命令所在的代码块有效--简而言之 大括号既是代码块,也就是说存在块级作用域了. { let a =10; var b =1; } a // Referen ...

  2. ECMAScript6-let与const命令详解

    前言 <ECMAScript入门>是一本开源的JavaScript语言教程,全面介绍ECMAScript6新引入的语法特性. let和const命令,是第一章开始介绍,也是比较基础的知识. ...

  3. es6学习笔记(1) let和const命令详解

    let和const命令: Es6新增了let命令,声明变量,但与var不一样的,只在let命令所在的代码块内有效(如for循环之外let声明的变量就不再有效).并且let不像var那样会发生" ...

  4. let和const命令//////////////////////z

    let和const命令 let命令 块级作用域 const命令 全局对象的属性 let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的 ...

  5. ES6之let(理解闭包)和const命令

    ES6之let(理解闭包)和const命令 最近做项目的过程中,使用到了ES6,因为之前很少接触,所以使用起来还不够熟悉.因此购买了阮一峰老师的ES6标准入门,在此感谢阮一峰老师的著作. 我们知道,E ...

  6. ECMAScript 6入门 - let和const命令

    详细学习链接: http://es6.ruanyifeng.com/#docs/let let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命 ...

  7. ES6 入门系列 - let 和 const 命令

    let命令 基本用法 ES6新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. { let a = ; ; } a // ReferenceEr ...

  8. ES6 之 let和const命令 Symbol Promise对象

    ECMAScript 6入门 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了. (2016年6月,发布了小幅修订的<ECMASc ...

  9. let和const命令

    let命令 1.let用来声明变量,类似于var,但只在代码块内有效. { let a = 1; var b = 2; } console.log(a); //a is not defined con ...

随机推荐

  1. Java用自定义的类型作为HashMap的key

      需要重写hashCode()和equals()方法才可以实现自定义键在HashMap中的查找. public class PhoneNumber { private int prefix; //区 ...

  2. C++ 头文件系列(istream)

    1. 简介 其实叫它istream有点不合适,因为该头文件不仅定义了istream,还定义了iostream. 2. basic_istream模版 basic_istream继承自basic_ios ...

  3. 细说Asp.Net WebAPI消息处理管道

    我们在开发完Asp.Net WebAPI程序后,可以使用WebHost寄宿方式或者SelfHost寄宿方式来部署Asp.Net WebAPI.所谓WebHost寄宿就是通过Asp.Net来实现:所谓S ...

  4. Java 程序测试_判断语句

    package test; public class Condition_Phase { public static void main (String[] args) { //The Traditi ...

  5. 【转】解决UpdatePanel 与 jQuery的冲突

    现在越来越多的朋友喜欢将jQuery和ASP.NET AJAX 一起来用,最近,许多印度人在forum里抱怨说UpdatePanel和jQuery不兼容,许多jQuery效果在UpdatePanel更 ...

  6. 8086cpu

    1.  8086CPU和8088CPU内部结构基本相同,不同之处在于8088有8条外部数据总线,因此为准16位.8086有16条外部数据总线.两个CPU的软件完全兼容,程序的编制也完全相同. 2.   ...

  7. 配置IIS Express以便通过IP地址访问调试的网站

    问题背景 最近使用C#编写了一个WebService,希望通过Java进行调用.使用Visual Studio 2013调试WebService时,可以在浏览器中通过localhost地址访问WSDL ...

  8. 《剑指offer》— JavaScript(1)二维数组中的查找

    二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ** ...

  9. linux oracle 10g 安装时 .bash_profile的设置

    export ORACLE_BASE=/home/oracle/oracle10g export ORACLE_SID=ccpbs export ORACLE_HOME=$ORACLE_BASE/pr ...

  10. JavaScript中数组Array方法详解

    ECMAScript 3在Array.prototype中定义了一些很有用的操作数组的函数,这意味着这些函数作为任何数组的方法都是可用的. 1.Array.join()方法 Array.join()方 ...