es6已经发布很久了,之前只会用var定义变量,学习了let和const后,又学到了一些作用域、JavaScript编译和深拷贝浅拷贝的知识。这章主要来说说这三个定义量的方法:

1.var

  在没学习es6时,会经常用到var,var用来定义一个变量,变量数据类型可以是基础数据类型,也可以是引用数据类型。它可以定义在全局,也可以定义在局部,但最后都会变成全局变量。并且后执行的赋值会覆盖之前的赋值,例:

var name = '小黑'
console.log(name) //小黑
function changeName() {
    console.log(name) //undefined
    var name = '小白'
    console.log(name) //小白
}
changeName() console.log(name)
//小白

  例子还是老例子,功能也没变。为什么会打印出undefined呢?js在执行之前会有一个编译过程,他会先在当前作用域中寻找执行时需要的量,如果有,就不再去外部找了,如果没有,就会跳出当前作用域去父级作用域找。此时编译时找到name,会先给这个变量赋值为undefined,在执行时,先执行的打印语句,所以在没有执行name赋值之前,name就是undefined。

  在全局下用var定义一个变量name,给它赋值为‘小黑’,然后在局部改变name的值,全局的name也变了。这样就有一个弊端,在不同的作用域下,用同一个变量名,所有的变量都会发生改变,或者说,在不同作用域里,不可以使用相同的变量名,因为它会改变全局的变量,所以es6发布了新的定义变量的方法:

2.let

  let和var作用一致,都是用来定义变量的。区别在于在:

    1.同一作用域下同一个变量只能被let定义一次,而var可以重复定义多次;

let name = '小黑'
let name = '小白'
//报错

var name = '小黑'
var name = '小白'
//name = '小白'

    2.用let定义变量会有暂时性死区,用let定义变量之前引用变量会直接报错,而用var定义变量之前引用变量会引用到undefined,称为变量提升;

console.log(name) //报错
let name = '小白'

console.log(name) //undefined
var name = '小白'

    3.在全局用let定义了变量,在局部里定义相同变量名后,全局的变量不会发生改变。

let name = '小黑'
function changeName(){
    let name = '小白'
    console.log(name) //小白
}
console.log(name) //小黑

var name = '小黑'
function changeName(){
    var name = '小白'
    console.log(name) //小白
}
console.log(name) //小白

3.const

  const的作用于let类似,它也有暂时性死区,相同的量名也可以定义在不同的作用域,并且在同一作用域下相同的量名只能被const定义一次。const与let的区别为:

    1.const定义的变量必须有初始值;

let name //undefined

const name //报错

    2.const定义的量是通过指针来保存数据的,这个量其实就是指针指向的地址,指针的指向不能变,所以const声明的量不能被改变;

let name = '小黑'
name = '小白'
// '小白'

const name = '小黑'
name = '小白'
// 报错

这节就说到这吧,希望小白和小黑能给大家带来快乐~~

版权声明:本文为btlbk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/btlbk/p/11395872.html