-
let命令
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
{
let a=222222;
var b=333333;
}
console.log(a)
以上代码在代码块之中,分别用let和var声明了两个变量。
然后,在代码块之外调用这两个变量。结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
sublime Text3运行js文件命令为 ctrl+b。
-
let不存在变量提升
变量的提升:javascript并不是严格的自上而下执行的语言,它会将当前作用域的所有变量的声明提升到程序的顶部。
如下面代码,变量aa未声明就赋值,赋值完再用var声明,最后输出aa是不会报错的。
但是,使用 let声明变量,在赋值前未声明会报错。
aa=2222;
var aa;
console.log(aa) //输出2222,当换成 let aa会报错
下面代码输出undefined的原因是 js会将变量的声明提升到顶部,可是赋值语句并不会提升。同样使用let声明就会报错。
console.log(aa) // 输出undefined
var aa=2222; // 实际上是分两步执行 var aa;aa=2222;
-
let 暂时性死区
var num=111;
if(1){
console.log(num);
let num=222; //块级作用域内let又声明了一个局部变量num,导致后者绑定这个块级作用域
}
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量就会报错。
总之,在代码块内使用let命令声明变量之前,该变量都是不可用的。
这在语法上,称为“暂时性死区”(temporal dead zone,简称TDZ)。
-
let 不能重复声明同个变量
let不允许在相同作用域内,重复声明同一个变量。
let num=111;
let num=222; // 报错内容:Identifier 'num' has already been declared
-
const 命令
const 声明一个只读的常量。一旦声明,常量的值就不能改变。
const num=123;
num=456 // 报错内容:TypeError: Assignment to constant variable.
console.log(num)
const声明的变量不得改变值,这意味着,const一旦声明变量就必须立即初始化,不能留到以后赋值。
只声明不赋值同样会报错。
const命令声明的常量和let类似,也是不能变量的提升,同样存在暂时性死区,只能在声明的位置后面使用,只在声明所在的块级作用域内有效,不可重复声明。
const声明的数组
const aa= [];
aa.push('firstNumber'); // 可执行
aa.length = 0; // 可执行
aa= ['secondNumber']; // 报错
以上代码说明,const定义的数组本身进行操作是不会报错的,但是将另一个数组赋值给aa会产生错误,因为const声明的常量不能重新赋值。