<script>标签内定义的JS变量处于何种作用域?
问题描述
我在HTML的<script>标签中编写了如下代码:
测试代码:
console.log('exist in ? scope', foo !== undefined) console.log('exist in window scope', window.foo !== undefined) console.log('exist in document scope', document.foo !== undefined) console.log('exist in globalThis scope', globalThis.foo !== undefined)
声明代码:
<script> class FooBar {}; const foo = new FooBar() </script>
在开发者控制台中,我能直接找到FooBar和foo,但原本预期它们会存在于window、document或globalThis对象中,可通过window.foo访问,实际却无法实现。请问这些变量处于哪个作用域?
解答
- 这些变量处于当前
<script>脚本的顶层词法作用域,但不会被挂载到window(即globalThis)对象上。 - 这是因为现代浏览器中,
const/let声明的顶层变量、以及class声明,和var的行为存在差异:var声明的顶层变量会自动成为全局对象(window/globalThis)的属性,因此可以通过window.foo访问。- 而
const/let和class声明的顶层变量,仅存在于当前脚本的顶层词法作用域中,不会成为全局对象的属性。
- 你能在开发者控制台中直接访问这些变量,是因为控制台默认共享当前页面的顶层词法作用域,因此可以直接获取到这些未挂载到全局对象的变量。
内容的提问来源于stack exchange,提问作者Dimitri Kopriwa
相关产品推荐
相关产品推荐

