函数声明可提前调用,因函数定义被整体提升至作用域顶部;函数表达式、箭头函数和class表达式仅变量声明提升,赋值前调用会报错;同名函数声明后者覆盖前者,混合使用时声明优先但赋值后覆盖;作用域限制调用范围,块级声明不可跨块访问。

JavaScript 函数声明的调用约束,核心在于“提升(hoisting)”机制——它决定了函数能否在定义前被安全调用。
函数声明可提前调用
使用 function 关键字声明的函数(如 function greet() { })会被整体提升到当前作用域顶部。这意味着你可以在声明语句之前就调用它,不会报错。
- 即使写在文件最下方,也能在开头就执行
greet() - 提升的是函数定义本身,不只是变量名
- 适用于全局作用域和函数作用域内
函数表达式必须先赋值再调用
用 const/let/var + function 表达式(如 const greet = function() { };)定义的函数,只有变量声明会被提升,赋值不会。调用前若未完成赋值,会得到 TypeError: greet is not a function 或 undefined。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
greet()放在const greet = function() {...}之前会失败 - 箭头函数、class 表达式也属于此类,同样不可提前调用
- 推荐统一放在使用前,避免依赖提升行为
命名冲突与覆盖规则
同一作用域中重复声明同名函数时,后声明的会覆盖前一个——但仅限于函数声明;函数表达式则按赋值顺序覆盖变量值。
- 两个
function foo() {}声明,后者生效 - 若混用:函数声明 + 函数表达式同名,函数声明优先(因提升),但表达式赋值后会覆盖
- 注意 var 声明的变量与函数同名时,函数提升仍优先生效
作用域边界影响可见性
声明位置决定调用范围。函数声明虽被提升,但只提升到其所在作用域顶部,不能跨作用域调用。
- 在 if 块或 for 循环里用
function声明,在严格模式下是语法错误;非严格模式下仍会提升至函数作用域顶部,而非块级 - 用
let/const声明的函数表达式具有块级作用域,块外不可访问 - 嵌套函数只能在其父函数内部调用,除非显式返回或暴露出去
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










