JavaScript执行上下文VO初始化顺序为:先形参(含实参赋值)、再函数声明(覆盖同名属性)、最后var声明(仅新增undefined,不覆盖已有)。

JavaScript 执行上下文中的变量对象(VO,Variable Object)在函数执行前会经历一个确定的初始化顺序:先处理形参,再处理函数声明,最后处理变量声明。这个顺序直接影响变量提升(hoisting)的表现和同名标识符的覆盖规则。
1. 先建立形参(含实参赋值)
函数被调用时,引擎首先根据函数定义的形参列表,在 VO 中创建对应属性,名称为形参名,初始值为 undefined;接着用传入的实参逐个赋值。若实参未提供,该形参仍保持 undefined。
- 例如:
function foo(a, b) { ... }调用foo(1)→ VO 中a = 1,b = undefined - 形参一旦建立,后续同名的
var声明或函数声明不会修改其存在性,但函数声明会覆盖它(见下)
2. 再扫描并挂载函数声明
引擎遍历函数体,找出所有 function 函数名() {...} 形式的声明,将函数名作为 VO 属性,值为对应的函数对象(即函数定义本身)。如果 VO 中已存在同名属性(比如形参或之前声明的函数),则直接覆盖原值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如:
function foo(a) { function a() {} }→ 先建形参a = undefined,再挂载函数声明 →a被替换为函数对象 - 多个同名函数声明时,后声明的覆盖先声明的(如两个
function bar() {...},后者生效)
3. 最后处理 var 变量声明
引擎扫描所有 var 声明,将变量名加入 VO,值统一设为 undefined。关键点在于:如果变量名已存在于 VO 中(无论是形参还是函数声明),这一步不做任何操作,跳过。
立即学习“Java免费学习笔记(深入)”;
- 例如:
function foo(a) { var a; }→a已是形参,var a不改变 VO -
function foo() { var a; function a() {} }→ 函数声明先挂载a为函数;var a因a已存在,被忽略 - 但
var a = 1的赋值语句属于执行阶段,不在 VO 初始化中,它只影响后续代码运行时的值
这个三步顺序解释了为什么函数声明能“提升”到最前并覆盖同名变量、为什么 var 无法覆盖已有的函数或形参、以及为什么看似混乱的重复声明最终有确定结果。本质不是语法糖,而是引擎在预编译阶段对 VO 的严格填充流程。

















