JavaScript函数表达式赋值时作为值处理,不提升,仅在执行到赋值语句时创建并绑定;var声明下变量提升但赋值不提升,let/const则完全不提升且存在TDZ;可匿名、命名或用箭头函数,赋值后可调用、传递、复制或重赋值(const除外);需区分赋值函数本身与调用结果,避免隐式全局污染。

JavaScript 函数表达式在赋值时,本质是把函数作为“值”来处理——它不会被提前提升(hoist),而是像数字、字符串一样,在执行到赋值语句那一行时才创建并绑定到变量。
函数表达式赋值的执行时机
与函数声明不同,函数表达式只在赋值语句执行时才生效。变量声明会被提升,但赋值不会。
-
var 声明 + 函数表达式:变量声明提升,但赋值不提升,访问未执行前的变量值为
undefined - let/const 声明 + 函数表达式:变量声明和初始化都**不提升**,在声明前访问会触发暂时性死区(TDZ)错误
赋值语法的常见形式
函数表达式可采用传统 function 形式或箭头函数,右侧必须是函数定义本身(不是调用)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const greet = function() { return "Hi"; };—— 匿名函数表达式 -
const add = (a, b) => a + b;—— 箭头函数表达式 -
const calc = function sum(x, y) { return x + y; };—— 命名函数表达式(名字仅在内部可用,不影响外部变量名)
赋值后的行为特点
赋值完成后,变量就持有对函数的引用,后续可调用、传参、作为参数传递,甚至重新赋值。
立即学习“Java免费学习笔记(深入)”;
- 调用需加括号:
greet();仅写greet是取函数引用,不是执行 - 可复制给其他变量:
const sayHello = greet;,两者指向同一函数 - 可作为参数传入其他函数:
setTimeout(greet, 1000) - 可被覆盖:
greet = () => "Bye";(const声明则报错)
容易出错的赋值陷阱
关键在于区分“赋值函数”和“赋值函数调用结果”。
- ✅ 正确:
const fn = function() { return 42; };→fn是函数 - ❌ 错误:
const result = function() { return 42; }();→result是42,不是函数 - ⚠️ 注意:
let x = y = function() {};中,y会成为全局变量(若未声明),这是隐式全局污染

















