跳到主要内容

JS 变量与常量(var、let、const)

JavaScript 变量命名规则

  • 基本规则

    • 只能包含:字母、数字、下划线 _ 、美元符号 $
    • 不能以数字开头。
    • 区分大小写( numNum 是两个不同的变量)。
    • 不能使用保留字(如 ifforclass 等)。

  • 命名风格

    • 推荐使用 驼峰命名法(camelCase)

      js
      let userName = "Alice";
      let maxCount = 10;
    • 常量通常用 全大写+下划线

      js
      const PI = 3.14159;
    • 类名使用 首字母大写(PascalCase)

      js
      class UserProfile {}

  • 可读性建议

    • 变量名应体现含义,不要用单字母(除非在循环里)。
    • 避免使用过长或模糊的名字。
    • 保持一致的命名风格(整个项目统一 camelCase 或 PascalCase)。

var(传统变量声明)

  • 特点:

    • 可以重复声明同一个变量。
    • 作用域是 函数作用域(function scope),非块级作用域。
    • 会发生 变量提升(声明会被提升到函数顶部,但赋值不会)。
  • 示例:

    js
    function testVar() {
    console.log(a); // undefined(变量提升)
    var a = 10;
    console.log(a); // 10
    }
    testVar();

let(块级作用域变量)

  • 特点:

    • 作用域是 块级作用域{ } 内部)。
    • 不允许重复声明同一作用域内的变量。
    • 不会发生变量提升(在声明前访问会报错,称为“暂时性死区”)。
  • 示例:

    js
    {
    let b = 20;
    console.log(b); // 20
    }
    // console.log(b); // 报错,b 不在作用域内

const(常量声明)

  • 特点:

    • 声明后必须 立即初始化
    • 变量值不能被重新赋值。
    • 对于对象或数组,引用不能变,但内容可变。
  • 示例:

    js
    const c = 30;
    // c = 40; // 报错,不能重新赋值

    const obj = { name: "Alice" };
    obj.name = "Bob"; // 允许修改对象内部属性

总结对比

声明方式作用域是否可重复声明是否可修改
var函数作用域可以可以
let块级作用域不可可以
const块级作用域不可不可重新赋值,但对象可变

全局作用域的声明方式

在 JavaScript 里,“全局作用域”取决于运行环境(浏览器还是 Node. js)。

浏览器中的全局作用域

  • 最外层声明的变量就是全局变量。

  • var 声明的会挂到 window 对象上,而 letconst 不会。

  • 推荐使用 globalThis 统一获取:

    js
    globalThis.x = 1;
    console.log(window.x); // 1

Node.js 中的全局作用域

  • 全局对象是 global ,而不是 window

  • var 在模块作用域内,不会自动挂到 global

  • 推荐使用 globalThis

    js
    globalThis.y = 2;
    console.log(global.y); // 2

什么时候使用全局变量

使用全局变量的场景

  • 配置信息:一些在整个应用中都需要使用的常量,例如 API 地址、版本号。

    js
    globalThis.API_URL = "https://api.example.com";
  • 调试阶段:快速测试或在控制台方便地访问某个数据。

  • 共享状态:在小型脚本中,不同函数之间需要共享某个简单数据。


不推荐使用全局变量的情况

  • 大型项目:全局变量容易造成命名冲突、难以维护。
  • 模块化开发:建议通过 import/export 或函数参数传递数据,而不是全局变量。
  • 并发环境:全局变量可能被意外修改,带来潜在 bug。