const,let,var的区别
JavaScript变量:分别有const,let,var 三种声明变量的方式
var x = 1
var y = 3
var z = x+y 从上例子中,可以查看到,x存储了1,y存储了3,z存储的x与y相加的结果4在JavaScript中可以先声明变量,但不赋值,比如 var carName,这个时候这个变量的值就为undefinde,不带有值的变量默认是undefinde,如果有哪个用到了这个变量,那所得到的结果就是undefinde
在es6,es6从es2015之后统称es6,引入了两个JavaScript新声明变量的关键字,分别是
let,const,引入了这两个关键字之后,js变得更加严谨,不能够随意去改变声明的值,比如const是常量,无法去重新赋值,let和cosnt都有它们所对应的作用域,没有对应的作用域提升。在没有引入这两个关键字之前,js中只有两种类型的作用域:全局作用域和函数作用域,作用域提升,代表,会先提升到之前,后去执行。
全局作用域:全局(在函数之外)声明的变量拥有全局作用域,比如我在script标签中声明了一个变量 var a = 1 那么我在这个script中无论哪个地方我都可以去访问到这个变量,除非是在你的当前作用域中也有一个var a = 1 那就会遵循就近原则而来进行访问离你最近的变量。
函数作用域:局部(在函数内)声明的变量就会拥有函数作用域,只能在函数本身去使用这个变量,但是这是绝对的吗?不一定,我们可以使用闭包来去访问一个函数中的变量,这样可以更加简便。像局部变量只能在它们被声明的函数内访问,但是通过var关键词声明的变量是没有块作用域,{
var x = 10
}
在对象外面我也是可以去访问到这个x的 console.log(x),但是let和const无法从外面去访问。
const与let的区别,在js中const必须在声明时就赋值,无法进行二次赋值,const只定义了对值的常量引用,但是如果const声明的是一个变量,我们可以改变常量对象的属性。常量数组也可修改。
补充:let/const也存在变量声明提升,只是没有初始化分配内存。
一个变量有三个操作,声明(提到作用域顶部),初始化(赋默认值),赋值(继续赋值)。
var 是一开始变量声明提升,然后初始化成undefined,代码执行到那行的时候赋值。
let 是一开始变量声明提升,然后没有初始化分配内存,代码执行到那行初始化,之后对变量继续操作是赋值。因为没有初始化分配内存,所以会报错,这是暂时性死区。
const 是只有声明和初始化,没有赋值操作,所以不可变。 注释:这里是参考的大佬说法。