美文网首页饥人谷技术博客
原来,我真的不懂let

原来,我真的不懂let

作者: CoderMageFox | 来源:发表于2017-07-28 10:35 被阅读47次

作为一个JS初学者,我一直是对ES6各种奇妙的语法带有一丝敬畏的.从var-let,promise,解构,到各种神奇的const骚操作,一直让我感觉ES6用的好的人似乎代码中包含着魔力.

今天在看知乎的时候,我发现了方方提的这样一个问题.
https://www.zhihu.com/question/62966713

问题问题
x
lex x=x
x
let x

第一个第二个的报错自然好理解,不用多废话.但是第三个和第四个就比较诡异了:如果我调用x,那么会提示x未被定义.但是当我想定义x的时候,x又是已经被声明的?

我发现以我的知识无法理解这个问题.

于是看了一下底下的回答:


titletitle

贺老的回答已经指出了问题的关键,但是对于我来说,还是理解的比较困难.
然后看了孙北吉 的回答,感觉自己又懂了一些.最后看了方方的博客,感觉自己似乎还是不太懂.于是尝试自己解释并总结一下.

问题的本质就是JS 变量的「创建create、初始化initialize 和赋值assign」.

在第一个报错直接输入x中,JS做了这样的操作:

在当前环境中进行查找x.
因为是全局环境   ,直接抛出一个 ReferenceError,提示x不存在.

在第二个报错lex x=x中:

lex x=x是一个RHS查询,它会直接进行值的查找并通知引擎做这些事:
 
 1. 创建变量.
 2. 开始执行代码(到现在为止,还未初始化)
 3. 将x进行初始化为undefined.(这个操作并不是赋值,仅仅是初始化)
 4. 执行RHS操作将x赋值给x.(这才是赋值操作)
因为我们的初始化语句与赋值语句是同一句,所以我们的let x=x同时执行了3\4步的操作.但是这里就出现了一个问题,这一句话是错的.在报错的同时,第三步已经执行完成了,而第四步就没有办法进行,在报错的同时也取消掉了第三步进行的对x的初始化.也就是说这个值已经进行了变量创建,但是并未初始化.所以:

在第三个报错x中:

这个变量x在当前的环境中已经存在(已经被创建过),但是事实上这个变量并未进行初始化,也就无法进行各种操作以及访问了.此时就会抛出一个Reference Error.

在第四个报错let x中:

在此处我们尝试着进行了let x,实际上执行的就是第二个报错的第一步-创建变量.但是变量已经被创建,所以会提示变量已存在.就这样,我们得到了一个已经被创建但是并未被声明且无法被访问的变量.

这就是我的理解,如果有错误,还请看到这里的你指正.谢谢.

So.Because JavaScript.

相关文章

  • 原来,我真的不懂let

    作为一个JS初学者,我一直是对ES6各种奇妙的语法带有一丝敬畏的.从var-let,promise,解构,到各种神...

  • 原来他真的不懂我

    原来他真的不懂我。

  • 2018-09-06

    我的忧伤、我的寂寞,原来 你真的不懂

  • 原来我真的读不懂浪漫

    《岳麓山下的情人》这本书是朋友推荐我看的,她说有着浪漫的情怀。她是因为这本书去了岳麓山,然后有了一个契机同他接着相...

  • 原来你真的不懂

    我一直认为爱是最好沟通的,有爱,有理解,有包容,有体谅 后面发现 并不是大家都在装聋作哑的听不懂,看不见 是真的不...

  • 读香帅第70课,如何看待市场利率

    做过投资的人基本都会有这么一个心路历程:我什么都不懂 - 原来我什么都懂 - 原来我真的不懂......他妈的要怎...

  • 原来,我真的看不懂爱情

    原来,我真的看不懂爱情 初见她时,她是一个羞涩的小姑娘,话不多,长得也特别文静,安静的坐在角落,甚至不抬头看看我们...

  • 原来他们是真的不懂

    特意调了课,也占用了学生的大课间时间(关于此,我不轻易占用,我也并不提倡这样的做法,但人在课堂,身不由己。不过庆幸...

  • 原来,我不懂

    随着年龄的增长,我越来越不懂许多事。 我不懂为什么我喜欢一个人孤独地走在公路两旁那窄窄的人行道上,人行道上还植着瘦...

  • 我真的不懂

    和孩子相处,懂孩子真的很重要。如果不懂孩子,就不知道怎么和孩子相处,怎么和孩子沟通。相处时就非常的难受,也可能不经...

网友评论

    本文标题:原来,我真的不懂let

    本文链接:https://www.haomeiwen.com/subject/neexlxtx.html