let 和const

let 命令

es6新增了let命令,用于声明变量,与var用法类似,但是使用let声明变量只在它所在的块内有效,而var则是定义的全局变量
{
    let a=10;
    var b=1;
}
a   //a is not defined,外部的a不能访问到上面块中定义的a变量
b   //1

  

let不存在变量提升提升

//使用var会发生变量提升,当脚本开始运行使用var命令声明的变量已经存在
console.log(foo);   //undefined
var foo=2;


console.log(foo);   //报错ReferenceError
let foo=2;          
//使用let声明,声明的变量一定要在声明之后使用,否则会报错

 

let不允许重复声明

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

//报错
function(){
    let a=10;
    var a=1;
    //let a=3;
}

 

const命令

const用于声明常量,并且该常量那个是只读常量,一旦声明该常量就不能被更改

const a=1;
a       //1
a=2;    //报错

 

并且const只声明,不赋值也会报错。

const a;    //报错

 

const变量和let一样只能在声明之后使用,并且命令生命的变量也不会提升,同样也不可以重复声明。

const本质

const的常量不能够更改实质上并不是变量的额值不能更改,而是变量指向的内存地址不能变动。

块级作用域

es5只有全局作用域和函数作用域,但是没有块级作用域。

没有块级作用域导致的问题

  1. 内层变量可能会覆盖外层变量
  2. 用来计数的循环变量泄露为全局变量
for(var i=0;i<10;i++){
    console.log(i)
}
console.log("外部"+i)
初出结果:
1
2
3
4
5
6
7
8
9
外部10

 


可以看出外部的i会受到循环体中i的影响,如果使用let就会有块级作用域,最后就会显示,外部i不能找到就会报错。

es6的块级作用域

在块级作用域中,外层作用域不能访问内层作用域的变量,,但是内层作用域可以定义外层作用域的同名变量。

function example(){
    let n=5;
    if(true){
        let n=10;   //内层作用域可以和外层作用域声明同名变量
    }
    console.log(n);     //5,外层作用域不会受到内层作用域的影响
}

 

块级作用域与函数声明

在es5中规定,函数只能在顶层作用域和函数作用域之中声明,不能再块级作用域中声明。
但是es6有所改变:

  1. 允许在块级作用域内声明函数
  2. 函数声明允许类似var,会提升到全局作用域或函数作用头部。
  3. 函数声明会提升到块级作用域头部
  4. 但是es6规定,在块级作用域中声明函数类似于let,在块级作用域之外不能引用。
  5. 但是需要避免在块级作用域中声明函数,一定要使用函数表达式形式写,而不是韩红素声明语句
//函数声明语句
{
    let a="test"
    function(){
        return a;
    }
}


//函数表达式
{
    let a="test";
    let f=function(){
        return a;
    };
}
//并且块级作用域一定要有大括号,才能声明函数

 

posted @ 2018-08-07 11:04  zzzjh  阅读(117)  评论(0编辑  收藏  举报