var与let与const
var与let与const都是用来声明变量,但是三者之间也有一些区别
var的使用
var a;//声明变量a
var a,b,c;//声明三个变量a,b,c
var a,b,c=2;//声明了三个变量只有c的值为2,
console.log(a,b,c)//undefined undefined 2
var 可以同时声明多个变量,也可以同时赋值
var a=1;
!function () {
console.log(a)//1
}()
函数内部未声明变量,那么用外面的全局变量
var a=1;
!function () {
var a=2;
console.log(a)//2
}()
如果内部外部都声明了,那么用内部的
下面的小案例有点意思了,注意看:
var a=1;
!function () {
console.log(a)//a的值为undefined
var a=2;
}()
这里要注意一下,函数内后面的var a=2;实际上是两步,var a; a=2;我们传统js里只有两个作用域,全局作用域跟内部作用域,在上述代码中,变量a在函数内部被声明了,那么这个a就等于undefined,我们可以理解为这样:
var a=1;
!function () {
var a;//undefined
console.log(a)
a=2;
}()
这里涉及到JavaScript中的两个概念:
暂时性死区:函数中声明了变量a,那么对于变量a来讲,该作用域锁死,将不能从外界获得a的值
变量提升:在同一个作用域下,变量a被声明了,那么该作用域上上下下到处都有了a,也就是说你在后面声明的变量,在前面也可以用,不一定非要是前面声明后面使用(强烈建议先声明后使用,不建议先使用后声明,我们的JavaScript是被大神在10天的时间内设计出来的,所以有一些缺陷,后续的let会逐渐改掉)。
let的使用
必须先声明后使用
let a=1;
console.log(a)//1
先使用,后声明,对不起,报错了
console.log(b)
let b=2;
函数内也一样,
let a=1
!function () {
let a=2;
console.log(a)//2
}()
可行,但是let不存在变量提升
let a=1
!function () {
console.log(a)//2
let a=2;
}()
报错:首先由于在函数内声明了a,那么在函数内作用域就不会去获取外面的a值,同时由于函数内我们console.log的时候,还没声明a,所以报错,let不存在变量提升,必须先声明后使用
const的使用
const很多人认为它是用来声明常量,但是这里说的常量跟我们js里真正的常量是不一样的,我们js中认为的常量是指数字、字符串等不可被修改的量,比如1就是1,它不是2,怎么也不能是2,这是常量,我们现在认为const声明的是常量其实是不准确的。
const声明的量就是变量,跟let或var声明的变量没啥大区别,唯一的区别就在于,const声明的变量不可以被修改,比如:
const a=1;
a=2;
console.log(a)
报错
但是const也不是一定不可被修改,比如:
const a={name:'xiaoming',id:'1'}
console.log(a)
a.name='xiaohong'
a.id=2
console.log(a)