var作用域

在JavaScript中,使用 var 关键字声明的变量具有函数作用域(function scope)或全局作用域(global scope),这取决于它被声明的位置。

1. 全局作用域:

  • 如果 var 声明在任何函数之外,那么它就是全局变量,意味着它可以在任何函数内部访问。
1var globalVar = "I am global";
2
3function test() {
4    console.log(globalVar); // 输出: I am global
5}
6
7test();

2. 函数作用域:

  • 如果 var 声明在函数内部,那么它只在该函数内部有效,外部无法访问。
1function test() {
2    var localVar = "I am local";
3    console.log(localVar); // 输出: I am local
4}
5
6test();
7console.log(localVar); // ReferenceError: localVar is not defined

需要注意的是,尽管 var 声明的变量具有函数作用域,但它不会创建块级作用域(如 if 语句或 for 循环)。这意味着在块内部声明的 var 变量实际上可以在整个函数范围内访问。

1function test() {
2    if (true) {
3        var blockVar = "I am accessible in the whole function";
4    }
5    console.log(blockVar); // 输出: I am accessible in the whole function
6}
7
8test();

为了解决这个问题,ES6 引入了 letconst 关键字,它们提供了块级作用域(block scope),更适合现代JavaScript开发。

  • 使用 letconst 在块级作用域内声明变量,可以确保变量只在特定的代码块内有效。
  • let 用于声明可以重新赋值的变量。
  • const 用于声明常量,一旦赋值后就不能修改。
1function test() {
2    if (true) {
3        let blockVar = "I am block scoped";
4    }
5    console.log(blockVar); // ReferenceError: blockVar is not defined
6}
7
8test();

总结来说,var 声明的变量可以是全局的,也可以是函数作用域内的,但不具有块级作用域。现代JavaScript开发推荐使用 letconst 来替代 var,以获得更好的作用域控制和代码可维护性。