1.一个前端小白的自述
这里是个前端小白,自学前端断断续续有一年时间,但是中途因为学习考试及研究生考试等原因一直耽搁,所以从今天开始在记录自己的学习经历,希望明年在同一时间可以与大厂大牛学习。也希望自己进入一个自己想要进入的公司
2.正题 var let和const区别
1.var在JS中是支持提前解析,而let不支持提前解析,也就是变量的问题
console.log(a);
var a = 10
//打印undefined
console.log(a);
let a = 10
//报错:b is not defined
这里需要解释一下undefined与 is not defined,我的理解,在英语解释上一都是未定义,但区别在于var声明相当于一个全局声明 上面的第一段代码类似于
var a
console.log(a);
var a = 10
这个时候a已经在全局或者说window内提前声明了,var在JS中运作相当于将所有声明先提取出来,然后再进行一个个从上到下赋值运行。所以先打印是undefined,然后再对a进行赋值。
而let不同,let相当于局部声明,let声明变量后,这个变量只能作用在这一行语句及以下的语句之中,不可作用在上面已经运行过的语句当中。
打个比方,就好像接力比赛,var要求你在100米处接棒,所以你要从起点开始跑到100米处再接棒,中途给的都是不var要求做的,所以是undefined;而let同样要求你在100米处接棒,但他是在100米处告诉你的,他让你拿到接力棒继续向前跑,不需要再重新跑了。
const与let作用相似,下面来讲解下const和let的区别
2.const与let的区别
当let定义变量"name"(这里的name是我定义的变量)时,后面可以进行值的修改。
当const定义变量"name"时,后面不能再进行值的修改。
let name = 10;
console.log(name);
name = 20;
console.log(name);
//10
//20
这里name的值在后面是可以修改的
而const的却非如此
const name = 10;
console.log(name);
name = 20;
console.log(name);
//10
//Uncaught TypeError: Assignment to constant variable.
很明显,这里第一个console正确打印了 而第二个console报错了,证明const的变量被声明之后是无法改变的,但是这里还要注意一点,学习代码要抱着疑问的态度,真的不能改变么?来看下面这个例子:
const b={};
b.a =20;
console.log(b)
//{a: 200}
这里是不是改变了?确实改变了,我明明定义b为一个空的对象,然后向b中加入了一个a属性并赋值20,打印出来的是一个对象中包含a。主要原因就是const定义的常量只要是引用类型数据,这种改变都是允许的,如果你愿意定义b为一个数组,然后再向其中加入一些代码,都是被允许的。记住引用类型包括:数组和对象
3.var可以重置定义同一个变量,但是let和const不可以
var a = 10;
var a = 20;
console.log(a)
//20
还是上面提到的,var属于全局变量,拿着大喇叭喊你从10米及20米拿到接力棒,但是你只能拿一个,那就只能先跑到10米拿一个,然后再跑到20米再拿一个,扔掉10米那个,但是这里我还是要提醒,代码可不是数学比较大小,谁大var声明变量赋值就是谁,这里指的只是先后顺序
let a = 10;
let a = 20;
console.log(a)
//Identifier 'a' has already been declared
“a”是已经存在的声明,很好理解,let不能定义同一个变量
4.let可以生成块级作用域,而var不能,如果想要var作用于块级作用域,只能采用函数封装的方式
(1)在ES6之前,采用立即执行函数,简称IFF
(function(){
var a =20;
})
console.log(a);
// a is not defined
之前我提到了,var是可以被改变的,为什么这里没有改变,就是因为这个括号和function函数内部用var声明的a只作用于function内部,作为局部变量。而不对外部var声明的同一变量产生作用,这是在ES6之前。
(2)let可以直接实现块级作用域
{
let b = 20;
}
console .log(b);
//b is not defined
5.var定义的全局变量会挂载到window上,可使用window进行访问,let定义的全局变量无法使用window访问
var a =20;
console.log(window.a)
//20
let a =20;
console.log(window.a)
//undefined
以上就是关于var let 和const的部分区别,我会在今后的学习中再进行积累,补充
参考:
# ES6里let、const、var区别总结