JavaScript中函数内用var声明的变量作用域究竟是什么?
JavaScript函数内用var声明的变量作用域到底是全局还是局部?
函数内用var声明的变量属于函数局部作用域,只能在该函数内部访问,函数外部无法直接访问。下面针对你提到的各类资源描述,拆解其中的理解误区:
关于MDN的描述
MDN指出:“用var声明的变量的作用域是包含var语句的最近的以下花括号包裹的语法结构之一:函数体、静态初始化块;若以上都不适用,则在模块模式下为当前模块,在脚本模式下为全局作用域。”
这段描述完全准确——函数体是var识别的作用域边界,因此函数内的var变量会被限定在函数内部,属于局部作用域。
关于w3schools的描述
w3schools则表示:“用var关键字声明的变量没有块级作用域,在{ }块内声明的变量可以在块外访问。”
这里的核心是区分函数作用域和普通块级作用域(比如if、for语句的{}块):
var确实不识别普通块级作用域,在这类块内声明的var变量会提升到所在的函数或全局作用域,块外部可访问- 但函数的
{}块是特殊的,属于var的作用域边界,var会受函数作用域约束,因此函数内的var变量无法在外部访问
举个代码例子:
// 普通if块内的var,外部可访问 if (true) { var blockVar = 1; } console.log(blockVar); // 输出1 // 函数内的var,外部不可访问 function demoFunc() { var funcVar = 2; } console.log(funcVar); // 报错:funcVar is not defined
关于freeCodeCamp的描述
freeCodeCamp提到:“未使用let或const关键字声明的变量会自动创建在全局作用域中”
这里特指未声明直接赋值的变量(比如直接写x = 10,而非var x = 10),这类变量会被挂载到全局对象上,属于全局作用域。但函数内用var声明的变量是明确声明的,不受这个规则影响,作用域仍限定在函数内部。
总结
- 函数内用
var声明的变量:函数局部作用域,仅函数内部可访问 - 普通块(if/for等)内用
var声明的变量:提升到所在函数或全局作用域,块外部可访问 - 未用任何关键字声明的变量:自动成为全局作用域变量
内容的提问来源于stack exchange,提问作者journeywithjavascript
相关产品推荐
相关产品推荐

