天天看点

ES6之let/const命令

let命令

ES6新增了let命令,用来声明变量。用法类似于var命令,但是所声明的变量,只在let命令所在的代码内有效,即块级作用域。

{
    let  a = 10;
    var b = 1;
}
console.log(a)   //ReferenceError:a is not defined.
console.log(b)   //1
           

上面代码在代码块之中。分别用let和var声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。

for循环的计数器,就很适合使用let命令。以后也会经常用到。

var oLis = document.getElementsByTagName('li')
for (let i = 0; i < oLis.length; i++) {
// ...
 oLis[i].onclick = function(){
      console.log(i)// 0 1 2 3 4
 }
}

console.log(i);
// ReferenceError: i is not defined
//上面代码相当与产生了几个块级作用域
{
     var i=0;
 oLis[i].onclick = function(){
      console.log(i)
 }
}

{
 var i=1;
 oLis[i].onclick = function(){
      console.log(i)
 }
}
           

上面代码中,计数器i只在for循环体内有效,在循环体外引用就会报错。

ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景,let实际上为 JavaScript 新增了块级作用域。

var命令会发生”变量提升“现象,即变量可以在声明之前使用,值为undefined。这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用。

为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错。

const命令

const声明一个只读的常量。一旦声明,常量的值就不能改变。

const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。

const PI = 3.1415;
console.log(PI) // 3.1415

PI = 3;
console.log(PI)
// TypeError: Assignment to constant variable.
           

上面代码表明改变常量的值会报错。