You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

<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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:20:25