全局执行上下文在遇到非defer/async的标签或执行首行js代码时立即创建,早于dom加载完成;其创建包含变量对象、作用域链和this绑定三步,且与domcontentloaded事件无关。

页面加载时,JavaScript 全局执行上下文会在脚本开始执行前自动创建,不需要手动触发。它由浏览器引擎(如 V8、SpiderMonkey)在解析并执行全局代码前初始化,是整个 JS 运行环境的起点。
全局执行上下文的创建时机
它不是在 HTML 解析完成时、也不是 DOMContentLoaded 事件触发时才创建,而是在以下任一情况发生时立即启动:
- 遇到
<script></script>标签(内联或外部),且该脚本未被defer或async延迟 - 浏览器开始执行全局作用域中的第一行可执行 JS 代码(包括变量声明提升后的初始化阶段)
- 对于模块脚本(
type="module"),全局执行上下文仍会创建,但模块本身运行在独立的模块执行上下文中,不直接共享全局this
创建过程的关键步骤
浏览器按顺序完成三个核心动作:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
创建变量对象(VO):包含所有
var声明、函数声明、以及隐式定义的arguments(全局环境下无 arguments)、this(指向全局对象,如浏览器中为window) - 建立作用域链(Scope Chain):全局上下文的作用域链只包含自身,即 [全局变量对象]
-
确定
this绑定:在非严格模式下指向全局对象;严格模式下为undefined(但全局上下文中浏览器仍让this指向window,这是规范与实现的兼容处理)
注意:和 DOM 加载状态无关
全局执行上下文的创建早于 DOM 构建完成。这意味着:
- 即使
document.body还不存在,JS 也能运行(但访问会报错) -
DOMContentLoaded是一个事件,发生在 DOM 解析完毕后,此时全局执行上下文早已存在并处于“执行阶段” - 把脚本放在
中,只要没有defer/async,它就会阻塞 HTML 解析,并在解析到该标签时立即创建并进入执行上下文
验证方式
可通过简单代码观察行为:
<script><br> console.log(this === window); // true(浏览器中)<br> console.log(typeof myFunc); // "function"(函数声明已提升)<br> console.log(myVar); // undefined(var 声明已提升,但尚未赋值)<br> var myVar = 123;<br> function myFunc() {}<br> </script>这段代码能正常输出,说明全局执行上下文已在脚本执行前完成创建与变量提升阶段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










