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
相关产品推荐
相关产品推荐

