let 和 const

ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
es6的let和const声明符,是不存在变量提升的;同时也只在块级作用域生效。

那么为什么要引入块级作用域呢?

  • 避免外层变量被覆盖
/**
*  用var声明变量
*/
 var name ="millet";
 function aa(){
     console.log(name)
    if(false){
        var name ="jayden";
      }
}
d() //undefined

/**
*  用let声明变量
*/

 var name ="millet";
 function aa(){
     console.log(name)
    if(false){
        let name ="jayden";
      }
}
d() //millet
  • 循环变量污染全变量
/**
*  用var声明变量,相信我们都遇到过这个问题,变量会被提升,所以在循环结束之后i就被累加到了6
*/
 var name ="millet";
 for(var i =0;i

暂时性死区

  • let和const声明是不会被提升的,所以为了保障声明的有效性,js的解释引擎会对变量所处的块级作用域形成一种保护,因此在声明之前使用会有语法错误,是不被允许的
 if(true){
    tmp = 'millet'//ReferenceError
    console.log(tmp)//ReferenceError
    let tmp
    console.log(tmp)//undefined
    tmp ='millet'
    console.log(tmp)//millet
}
  • 不能重复声明
function hello(){
    var name ='millet'
    var name ='jayden'
    console.log(name)
}
hello()//jayden
function hello1(){
    var name ='millet'
    let name ='jayden'
    console.log(name)
}
hello1()//SyntaxError
function hello2(){
    let name ='millet'
    let name ='jayden'
    console.log(name)
}
hello2()//SyntaxError

const 常量

const 大多特性和let相同,const声明的简单类型的数据被声明了就不能被修改,复合类型的数据(对象、数组),const只能保证指针固定,而具体对象实例包含的属性是可以被修改的

const name ='millet'
console.log(name)
 
 const arr =[]
 arr[0]='jayden'
 console.log(arr)

 const obj ={}
 obj.name='jayden'
 console.log(obj)

 const name1 = 'millet'
name1 ='jayden'
console.log(name1)//Uncaught SyntaxError: Identifier 'name' has already been declared

你可能感兴趣的:(let 和 const)