上面两个输出为什么会不一样? 我这里猜想是与LexicalEnvironment(词法环境)和VariableEnvironment(变量环境)有关系,所以根据这篇文章的内容: https://zhuanlan.zhihu.com/p/53135129 第二张图的结果很容易能推出来,那第一张的结果就属于完全无法理解了,在我的理解中它的词法环境
和变量环境
在预编译后会有两个相同的属性a
,此时应该报SyntaxError: Identifier 'a' has already been declared
的错误才对。
红米K30 Pro 变焦版
最近正在系统学习JS,等我学成归来为你解惑,也许2,3年。等我兄弟!
小米8(白)
看的我更迷惑了...
人生若只如初见
看起来它确实是立即执行的代码块。
那么let
的作用域问题就令人迷惑了。
@水木易安,@老虎会游泳, 这里有一个回答: https://stackoverflow.com/questions/31419897/what-are-the-precise-semantics-of-block-level-functions-in-es6) 再结合知乎的文章,我推测
var a1 = undefined
{
let a2 = funcrtion a() {}
a2 = a
a1 = a2
}
这段代码中的 a1就是VariableEnvironment(变量环境),a2就是LexicalEnvironment(词法环境)。这样理解那这段代码逻辑是可以说清楚的,但是当第一行的var变成let后,两个a都在LexicalEnvironment(词法环境)了,我的理解应该会报错,但是实际上直接输出了0
红米K30 Pro 变焦版
@Curtion,只有进入严格模式才会报错。
非严格模式使用未定义变量都不会报错,所以……