You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中local scope与function scope的区别是什么

JavaScript中local scope(局部作用域)与function scope(函数作用域)的核心差异

首先明确一个最容易被老资料误导的结论:二者不是平级的对等概念,函数作用域是局部作用域的其中一种具体类型,早年资料把二者划等号是ES6发布前的历史遗留问题。


基础概念定义

  • 局部作用域(local scope):是和全局作用域相对的通用概念,泛指所有和全局环境隔离、内部声明的变量/函数只能在当前作用域范围内访问、外部无法直接读取的作用域,是一个上层分类。
  • 函数作用域(function scope):是JavaScript最早实现的一类局部作用域,边界由函数声明的花括号{}划定:所有声明在函数内部的变量,无论使用var/let/const哪种关键字,都只能在函数内部(包括函数内嵌套的子作用域)访问,函数外无法直接读取。

表述差异来源:2015年ES6标准发布前,JavaScript不存在块级作用域,除了全局环境外,只有声明在函数里的变量能形成隔离的私有范围——也就是说当时所有的局部作用域全都是函数作用域,因此早年的教程、资料会直接把两个概念等同,这就是你看到不同资料说法不一致的根本原因。


代码示例

1. 函数作用域属于局部作用域

function testFunc() {
  // 变量a声明在函数内部,属于函数作用域,同时也是局部作用域变量
  const a = 123;
  console.log(a); // 正常输出123
}
testFunc();
console.log(a); // 抛出引用错误:a is not defined,外部无法访问局部变量

2. 局部作用域不止函数作用域一种

ES6新增块级作用域后,只要是{}包裹的代码块(比如if判断、for循环、单独的代码块),用let/const声明的变量都会被限制在块内访问,这类块级作用域也属于局部作用域,但不属于函数作用域:

if (true) {
  // 变量b声明在if代码块内部,属于块级作用域,同样是局部作用域变量
  const b = 456;
  console.log(b); // 正常输出456
}
console.log(b); // 抛出引用错误:b is not defined,外部无法访问,但b没有声明在函数内,不属于函数作用域

除此之外,ES6的模块作用域、try/catch中catch子句的绑定作用域,都属于局部作用域的范畴,同样不属于函数作用域。


核心区别总结

  • 范畴不同:局部作用域是对所有非全局私有作用域的统称,函数作用域只是局部作用域下的一个具体子类。
  • 边界规则不同:函数作用域的边界固定为函数的起止花括号;而局部作用域的边界根据类型不同,可以是函数花括号、代码块花括号、模块文件边界等。
  • 适用语境不同:把二者等价的表述仅适用于ES5及更早的JS环境,在当前遵循ES6+标准的开发场景下,这种表述是不严谨的。

内容的提问来源于stack exchange,提问作者SoF

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 20:27:31