4
0
0

JavaScript变量

2026-10-08
2026-10-08

什么是变量

  变量是编程中用于存储数据的命名容器。可以将变量想象成一个贴有标签的盒子:

  • 变量名就是盒子上的标签
  • 变量值就是盒子里存放的内容

  特点:

  • 变量必须先声明后使用
  • 变量可以存储不同类型的数据(数字、字符串、布尔值等)
  • 变量的值可以改变(​let 声明的变量)
  • 通过变量名来访问和操作数据

  示例:

let message = "Hello"; // 声明一个变量message,存储字符串"Hello"
console.log(message); // 使用变量,输出: Hello
message = "World";    // 修改变量的值
console.log(message); // 输出: World

定义变量的三种方式

  JavaScript 有三种声明变量的方式:

方式 特点 示例
var 传统方式,函数作用域,存在变量提升(现代开发中已不建议使用) var x = 10;
let 块级作用域,不允许重复声明,不存在变量提升(ES6 新增) let y = 20;
const 块级作用域,声明时必须初始化且不能重新赋值(ES6 新增) const PI = 3.14159;

var

var age = 25; // 声明并初始化
var name;     // 声明但不初始化(默认值undefined)
name = "张三"; // 后续赋值

  特点:

  • 作用域为函数作用域或全局作用域(直接写到 script 标签中会自动挂载到 window 对象上)
  • 存在变量提升(可以在声明前访问,值为 undefined)
  • 可以重复声明

  函数作用域可以这样理解:

<script>
  function test(){
    if(true){
      var a = 10;
    }
    // 这是允许的。
    console.log(a);
  }
  test();
</script>

  全局的 var 变量会挂载到 window 对象上,可以测试一下:

<script>
    var a = 100;
    console.log(window.a); // 100

    let b = 200;
    console.log(window.b); // undefined
</script>

let

let count = 0; // 必须使用let声明
count = 1;     // 可以重新赋值
// let count = 2; // 错误,不能重复声明

  特点:

  • 块级作用域:​{}​内有效(直接写到 script 标签中不会自动挂载到 window 对象上)
  • 不存在变量提升(必须先声明后使用)
  • 不能重复声明

  块级作用域可以这样理解:

<script>
  function test(){
    if(true){
      let a = 10;
    }
    // 这里是报错的。
    console.log(a);
  }
  test();
</script>

const

const MAX_SIZE = 100; // 声明时必须初始化
// MAX_SIZE = 200;    // 错误,不能重新赋值
const user = { name: "John" };
user.name = "Mike";   // 允许,因为对象内部属性可以修改

  特点:

  • 也是块级作用域:​{} 内有效
  • 必须声明时初始化
  • 不能重新赋值
  • 对于对象/数组,内容可以修改(不能修改的是绑定关系)

变量的赋值和使用

基本赋值

let a = 10;       // 数字
let b = "文本";    // 字符串
let c = true;      // 布尔值
let d = null;      // 空值

多变量声明

let x = 1, y = 2, z = 3; // 一行声明多个变量

变量使用

let price = 100;
let quantity = 5;
let total = price * quantity; // 使用变量进行计算
console.log(total); // 输出: 500

变量重新赋值

let score = 80;
score = 90; // 合法(使用let声明)
score = score + 10; // 现在score是100

变量交换(ES6 方式)

  ES6 的解构赋值:(以下是数组解构语法)

let first = "A", second = "B";
[first, second] = [second, first]; // 交换变量值
console.log(first, second); // 输出: B A

  ES6(ECMAScript 2015)中的解构赋值(Destructuring Assignment) ,它的作用是从数组中快速提取值并赋值给变量,属于语法糖:

const [a, b] = [200, 300];

  对象解构语法是用大括号:​{}

let user = {
    username: 'jack',
    age: 20
}
let {username, age} = user;
console.log(username, age);

变量的作用域

  变量的作用域指变量可被访问的范围,JavaScript 中变量有三种作用域:

全局作用域

  在函数外部声明的变量

let globalVar = "我是全局变量"; // 全局变量
var globalVar2 = "我也是全局变量,我会自动挂载到window对象上";

function test() {
  console.log(globalVar); // 可以访问
  console.log(globalVar2); // 可以访问
  console.log(window.globalVar2); // 可以访问
}
test();

函数作用域

  使用​var 声明的变量在函数内部有效

function myFunction() {
  if(true){
    // 函数作用域:虽然在if的分支大括号中,但是整个函数中都可以用。
    var localVar = "局部变量";
  }
  console.log(localVar); // 可以访问
}
// console.log(localVar); // 错误,外部无法访问

块级作用域

  使用​let​和​const​声明的变量在代码块​{}​内有效。​var 不能声明块级作用域。

if (true) {
  let blockVar = "块级变量";
  console.log(blockVar); // 可以访问
}
// console.log(blockVar); // 错误,外部无法访问

  var 无法定义块级作用域

声明方式 函数作用域 块级作用域 全局作用域
var ✅ ❌ ✅
let ✅ ✅ ✅
const ✅ ✅ ✅

作用域链规则

  • 内层作用域可以访问外层作用域的变量
  • 外层作用域不能访问内层作用域的变量
  • 相同作用域中不能重复声明​let​/​const 变量

  示例:

let outer = "外部";

function scopeTest() {
  let inner = "内部";
  console.log(outer); // 可以访问外部变量
}

scopeTest();
// console.log(inner); // 错误,无法访问函数内部变量

就近原则

  当内层作用域声明了与外层同名的变量时:

let value = "全局";

function printValue() {
  let value = "局部";
  console.log(value); // 输出"局部"
}

printValue();
console.log(value); // 输出"全局"

隐式全局变量

  在 JavaScript 中,如果在函数体内定义变量时没有使用 ​var​、​let​ 或 ​const​ 关键字,那么这个变量会被隐式创建为 全局变量,即使它是在函数内部定义的。

<script>
  function greet(){
    // 隐式全局变量
    username = "jackson";
  }
</script>

  在 严格模式( ​'use strict'​ ) 下,直接给未声明的变量赋值会抛出 ​ReferenceError

<script>
  // 使用严格模式
  'use strict'
  
  function greet(){
    // 隐式全局变量
    username = "jackson";
  }

  greet();
</script>

  JavaScript 在非严格模式下允许隐式创建全局变量,这是语言早期设计的一个缺陷。严格模式和现代声明关键字(​let​/​const)的引入,正是为了纠正这种行为,使代码更可预测和可维护。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

JavaScript变量
/archives/post-1791433074175
作者
Bam
发布于
2026-10-08
许可协议
CC BY-NC-SA 4.0

评论