ES6新增加了两个重要的 JavaScript 关键字: let 和 const。
let 声明的变量只在 let 命令所在的代码块内有效。let
实际上为 JavaScript 新增了块级作用域。
const 声明一个只读变量,声明之后不允许改变。意味着,一旦声明必须初始化,否则会报错。
首先我们要知道块级作用域:任何一对花括号中的语句集都属于一个块,在这之中定义的所有变量在代码块外都是不可见的,我们称之为块级作用域。
ES5 只有全局作用域和函数作用域,没有块级作用域,块级作用域是ES6出现的一个概念。
1.代码块内有效
let 是在代码块内有效,var 是在全局范围内有效。
{ let a = 1; var s = 2; } console.log(a); //报错 ReferenceError: a is not defined console.log(s); //2 //let是在代码块内有效,var在全局范围内有效
2.不能重复声明
let在相同的作用域内只能声明一次 ,var 可以声明多次。
let a = 1; let a = 10; var s = 2; var s = 20; console.log(a); //报错 Identifier 'a' has already been declared console.log(s); //20 //let 只能声明一次 var 可以声明多次
3.不存在变量提升
let ,const不存在变量提升,var 会变量提升。
首先说一下什么是变量提升:函数及变量的声明都将被提升到函数的最顶部。注意JavaScript并不是严格的自上而下云习惯的语言。
console.log(a); //ReferenceError: a is not defined let a = "hello"; console.log(d); //ReferenceError: d is not defined const d = "good"; //let,const不存在变量提升 console.log(s); //undefined var s = "javascript"; //var存在变量提升。即当脚本开始运行的时候,b这个变量已经存在了,但是还没有赋值,所以会输出 undefined。
4.暂时性死区
var s = "a"; if(true){ //这是一个封闭的作用域 console.log(s); // ReferenceError: s is not defined const s = "3.1415926"; console.log(s); // 3.1415926 //存在全局变量s,但是块级作用域内const又声明了一个局部变量s,导致后者绑定这个块级作用域,所以在const声明变量前,对s赋值会报错。
//上面代码中,在const
命令声明变量s
之前,都属于变量s
的“死区”。 }
ES6 明确规定,如果区块中存在let
和const
命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用let
命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”(temporal dead zone,简称 TDZ)。
5.const对数组和对象的元素修改不算作对常量的修改。
const GROUPS =["tom","jerry","jack"]; GROUPS.push("sun"); console.log(GROUPS); //合法的,GROUPS数组修改为["tom","jerry","jack","sun"]
const 做到变量在声明初始化之后不允许改变是因为const 其实保证的不是变量的值不变,而是保证变量指向的内存地址所保存的数据不允许改动。并且默认常量使用大写。
ES6有六种声明变量的办法:var,let,const,function,import,class。