函数表达式赋值给变量后,其作用域完全遵循变量本身的作用域规则:const/let定义在块内则仅块内可见,var声明会提升但赋值不提升,模块顶层则属模块级作用域;内部变量查找按词法作用域链进行;箭头函数无独立this等绑定,但变量作用域规则不变;漏写声明符将导致非严格模式下创建全局变量。

函数表达式赋值给变量后,它的作用域管理完全遵循变量本身的作用域规则,而不是像函数声明那样被“提升”到作用域顶部。简单说:它就是个普通变量,值恰好是个函数。
函数表达式本质是变量赋值
写成 const myFn = function() { ... }; 或 let handler = () => { ... }; 时,等号左边的 myFn 或 handler 是一个标识符,它受所在位置的词法作用域约束:
- 如果用
const/let在块内定义,那它只在该块内可见; - 如果在函数顶部用
var声明,会被提升(但赋值不会),调用时可能报undefined is not a function; - 如果在模块顶层定义,就属于模块级作用域(相当于全局作用域,但不挂载到
window)。
作用域链查找不受函数类型影响
函数表达式内部访问变量时,查找逻辑和普通函数一样——按词法作用域向上找:
- 先查自身函数体内定义的局部变量;
- 再查外层函数(如果有嵌套)的变量;
- 最后查全局(或模块顶层)变量。
例如:
const x = 'global';<br>
function outer() {<br>
const x = 'outer';<br>
const inner = function() { console.log(x); };<br>
inner(); // 输出 'outer',不是 'global'<br>
}这里
inner 虽然是表达式,但它捕获的是定义时的外层作用域(outer 函数),不是调用时的位置。
箭头函数有特殊词法绑定
如果函数表达式是箭头函数(() => {}),它没有自己的 this、arguments,也不绑定 super 或 new.target,而是继承外层函数的这些值。这点和普通函数表达式不同,但变量作用域规则不变——它依然遵循定义位置的词法环境。
避免意外的全局污染
漏写 const/let/var 直接赋值:myFn = function() { ... };
会在非严格模式下自动创建全局变量(挂到 window.myFn),这是常见隐患。务必始终显式声明变量。

















