谈谈var变量提升以及var,let,const的区别

1.首先我们理解一个‘’提升‘’这个概念,意思就是无论var aaa =“我是var"这行代码在哪个位置,变量的声明都会被提升到所在作用域最前端执行,而变量的赋值则是在当前行执行,我们来个简单的例子
2.ex1
在这里插入图片描述
1.第一行输出aaa,而此时在同一作用域中,下一行的var aaa=“我是var”,声明并赋值了,所以按照提升机制,var aaa 将提升到第一行,但是 aaa=“我是var"仍在console.log(aaa)之下,所以第一个输出undefined。
2.接下来执行hhh()函数,依葫芦画瓢,同理,依次输出undefined,我是var2;
3.回到最后一行的输出,输出的是"我是var"而不是"我是var2”,因为我们在函数其实重新声明过aaa的,但是函数中的声明的变量均为局部变量,在离开函数后,将会被立即销毁,而且局部变量并不会影响全局变量,可以说此aaa非彼aaa,反之,如果我们在函数中直接赋值aaa=“我是var2”,我们修改的是全局变量aaa的值,那么最后输出的就是"我是var2”。

3.var,let,const的区别
var:没有块的概念,可以跨块访问, 不能跨函数访问。
let:能在块作用域里访问,不能跨块访问,也不能跨函数访问
const:用来定义常量,使用时必须初始化(即必须赋值),只能在块作用域里访问,而且不能修改。
来一个小小的example
ex2:
在这里插入图片描述
只能输出一个1,下面两个均会报错 is not defined。
在这里插入图片描述
而当我修改namee的值时,便会报错 Assignment to constant variable。
在这里插入图片描述
而重新声明并赋值依然会报错 Identifier ‘namee’ has already been declared
然后,如果namee是一个对象呢?是不是也不能修改?
这里我看到了一篇文章https://blog.csdn.net/unionz/article/details/80032048。里面讲述了const声明的对象是否能修改。所以我们也来试试看!
ex3:
在这里插入图片描述
结果是它并没有报错,而是输出了{name: “222”, sex: “male”},是的没错,被修改了。
so why?
由于对象是引用类型,ooo中所保存的是对象的指针,而不是值,const只是不让你改变指针,而修改对象的属性时并不会改变指针,因此这种操作时被允许的。
4.最后我们再思考一下,let和const是否也存在提升?,try it!
在这里插入图片描述
在这里插入图片描述
额。。。很明显,都是不被允许的 Cannot access ‘aaa’ before initialization。所以只有var有提升机制,let和const都没有。
5.综上所述,三者的共同处都是不可跨函数,
不同之处:var可跨包,可提升,而let和const不可跨包,不可提升。
const不可更改,而let和var都可更改。

				over!欢迎指正 !!!!!!
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值