JavaScript块级作用域变量外部访问无输出问题咨询
问题复现
运行如下HTML代码时,id为Test1、Test2、Test3的三个p标签均无内容展示:
<p id="Test1"></p> <p id="Test2"></p> <p id="Test3"></p> <script> { let v; v = 10; } let g = 20; var h = 15; document.getElementById('Test1').innerHTML = v; document.getElementById('Test2').innerHTML = g; document.getElementById('Test3').innerHTML = h; </script>
疑问点:按照JavaScript语法规则,let声明的变量无法在块级作用域外部访问,花括号包裹的块作用域在闭合位置就已经终止,为什么三个标签都没有输出内容?
原因说明
核心原因是未捕获的引用错误直接中断了整个脚本的执行:
- 变量
v是在独立花括号包裹的块级作用域内通过let声明的,它的作用域仅存在于这层花括号内部,块外不存在该变量的绑定。当代码执行到document.getElementById('Test1').innerHTML = v;这一行时,会直接抛出Uncaught ReferenceError: v is not defined的错误。 - JavaScript同步代码执行过程中,只要遇到未被捕获的运行时错误,就会立刻终止当前脚本后续所有代码的执行。也就是说,给Test2、Test3赋值的两行代码根本没有机会运行,自然两个标签也不会展示任何内容。
你可以打开浏览器的开发者控制台,就能直接看到上述引用错误的报错信息;如果把访问v的那行代码注释掉再运行,g和h的值就会正常渲染到对应的p标签中,这两个变量的声明和访问逻辑本身没有问题。
内容的提问来源于stack exchange,提问作者Sascha Fischer
相关产品推荐
相关产品推荐

