javascript每句代码背后的故事一

原创 天下无双 随笔 原生javascript 169阅读 2019-02-18 19:51:01 举报

var,let,const这个是我们非常常用的代码,但是你知道你写下它们的时候背后发生了什么吗?待我给你细细道来

var在没有es6的时代,是独霸天下的,当我们写下它的时候js引擎在解释阶段会做变量提升相当于把这句放到了代码的最前面。

所以这种情况不会报错,而是打印出undfined。
这里说到一个js引擎。js引擎在对我们写的代码做处理的时候分为解释阶段执行阶段,解释阶段就是为我们的代码执行做准备,这阶段js引擎做了很多事情,比如创建执行的上下文,创建作用域等等,变量提升也是在这阶段做的。函数声明的时候也会做提升,而且函数的提升会在变量提升的前面,但是如果你是用var a = function(){}这种方式声明函数的话,你在前面执行会报错,因为js引擎把它当作了变量来提升。

到了es6时代鼓励大家用let来代替var,因为变量提升这种处理会导致一些奇怪的事情,所以使用let就不会存在变量提升了,这个原因大概是这样的,当js引擎在解释阶段发现let或者const后,遵循es6规定这些变量在没声明前无法使用,并且let会形成封闭的块级作用域,在这个块级作用域外面无法访问的这个let变量,这个块级作用域最明显的表现就是

这种代码会报错说找不到a,因为if里面let形成了封闭块级作用域,外面无法访问到a。另外let还可以在在循环体里重新声明,也就是每次循环都会用let声明一下

还有一点,let不属于全局作用域里也就是不属于window对象下面,如果用var a = 1声明可以用window.a得到这个值,如果是这样let a = 1声明你在window.a里面是没有的。

const其实没什么好说的很多地方和let相似,但是有一点要说下,用const声明的是引用类型比如对象,你可以在这个对象里面添加值,但是不能改变这个对象的内存地址,这个牵扯到数据类型这块,下次在说说吧,var,let,const就这么多故事。

评论 ( 3 )
最新评论
hugeannex 2F 2019-02-19 13:08:21 3F

呃,你这是往杂里整?

天下无双 1F 2019-02-19 11:35:30 2F

这个主要是计划整理自己的所有碎片知识点,方便自己以后查阅,现在才是js阶段,后面还要整理php,node,nginx等很多其他方面,整理完准备去大厂面试一下

hugeannex 2019-02-19 10:28:59 1F

咳咳,怎么感觉这笔记有点充数呢。。。