函数声明提升本质是预编译阶段将函数对象整体挂载到go/ao中;函数声明优先级高于var,同名时var声明被忽略;函数表达式仅变量名提升,赋值在执行阶段。

函数声明提升的本质是注册函数对象
在预编译阶段,JS 引擎不会“复制代码”或“移动文本”,而是将函数声明解析为一个完整的函数对象,并直接将其作为属性值存入当前作用域的执行上下文(GO 或 AO)中。这个过程发生在语法分析之后、执行之前,属于内存初始化行为。
预编译时函数体被整体加载进执行上下文
以全局作用域为例,引擎执行三步预编译:
- 创建全局对象 GO(即 window)
- 扫描所有 function 声明,提取函数名和整个函数体,生成函数对象
- 将该函数对象赋值给 GO[函数名],例如 GO.foo = function foo() { ... }
这意味着函数体在执行阶段开始前就已构造完毕,可随时调用。不是“把代码挪到顶部”,而是“提前造好对象并挂载好”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
函数声明优先级高于 var 变量声明
当同名的函数声明与 var 变量声明共存时,预编译按固定顺序处理:
- 先处理所有 function 声明,完整挂载函数对象
- 再处理 var 声明,仅设为 undefined(若已存在同名函数属性,则跳过,不覆盖)
例如:function a(){}; var a = 123; —— 预编译后 a 仍是函数,var a 的声明被忽略;但若写成 var a = 123; function a(){},结果一样,因为函数声明仍会覆盖。
函数表达式不享受同等待遇
像 var b = function() {} 这类写法,预编译只处理 var b(提升为 undefined),而赋值右侧的函数表达式属于执行阶段语句,不会提前构造。所以调用 b() 会报 TypeError: b is not a function。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










