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!欢迎指正 !!!!!!