这是我的MDN表格。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let
1. function test(){
2. var foo = 33;
3. {
4. let foo = (foo + 55); // ReferenceError
5. console.log(foo);
6. }
7. }
8. test();
根据MDN网站:
与以var声明的变量(其值将以undefined开头)不同,let变量必须在对其定义求值后才进行初始化。
现在:由于我正试图了解(这是错误的),因此不应抛出ReferenceError
,因为:
当解释器到达第4行时[现在var
foo
存在于内存中并分配了33。但是尚未创建let
foo(临时死区)。
现在=
运算符的第4行右侧。它应该在当前块中搜索foo(未找到,尚未创建becoz let
foo。)然后--->在父块中搜索(找到,becoz全局且可用)。
然后在内部程序块第5行应打印88。但是在第4行会抛出ReferenceError
。
请解释此行为,该代码将如何逐步执行(如果可能,将使用伪汇编代码)。以及每个块的执行上下文视图。