JS中var、let、const详解

        首先,var、let、const在项目开发中都是用来声明变量的,在ES5中只有两种声明变量的方法:var和function,在ES6中新增了let、const、class、import四种声明变量的方法,本文主要讲解var、let与const的语法,其他的大家有兴趣可以了解一下。

       一、let的基本语法

                let的用法与var用法相似,都是用来定义一个变量,但let定义的变量没有变量提升,也就是说,使用let定义的变量,必须要在变量声明完以后使用,不然会报错。

//存在变量提升
console.log(a)    //undefined
var a =10

//不存在变量提升,需先声明后使用
console.log(a)    //报错    语法上称为暂时性死区
let a = 10

                let定义的值只在所在代码块中生效,var定义的值在全局范围内都有效。

//var定义的值在全局有效,let定义的值只在所在代码块有效

{
    var a = 10,
    let b = 10
}
console.log(a)    //10
console.log(b)    //报错

                敲重点,面试题,如何输出1-10的数值。可能觉得这不简单一个for就可以了,这个时候需要注意定义变量时记得用let定义,用var的话会输出10个10。可以研究下列案例,相信你会明白。

//循环输出通一变量值
for(var i=0;i<5;i++){
    console.log(i);//0,1,2,3,4  全局   
    setTimeout(function(){
        console.log(i)//5,5,5,5,5  内部 
    },1000);//每次循环更改的是全局的i,所以最后输出的都是最后循环的i,可以通过闭包来解决这个问题
 }
//闭包解决
for(var i=0;i<5;i++){
   (function(k){
    setTimeout(function(){console.log(k)},1000)
    })(i);
}


//循环输出通一变量值
for(let i=0;i<5;i++){
    console.log(i);//0,1,2,3,4  全局   
    setTimeout(function(){
        console.log(i)//0,1,2,3,4 内部 
    },1000);//当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。
 }


小知识点:for循环还有一个特别之处,就是设置循环变量的那部分是一个父作用域,而循环体内部是一个单独的子作用域。(他循环他的,你输出你的)

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

function aaa(){
    var a = 10
    var a = 20
    console.log(a);
}
aaa()//20

function aaa(){
    let a = 10
    let a = 20
    console.log(a);
}
aaa()//报错

                ES6新增块级作用域每一个{ }都属于一个作用域。上一层作用域无法访问到下级作用域的变量。

        二、const的基本语法

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

let a=2
a=3
console.log(a);//3

const a=2
a=3
console.log(a);//报错

const a    //值声明不赋值会报错

                const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

如果真的想将对象冻结,应该使用Object.freeze方法。

你可能感兴趣的:(javascript,html5,es6)