上节我们学习了函数的操作,本节将介绍 JavaScript 中变量的基础概念。

全局变量:

全局变量是在全局作用域中声明的变量,即在任何函数之外声明的变量。全局变量在整个脚本执行期间都存在,可以被任何函数访问和修改。

全局变量的声明方式

1. 使用关键字声明(推荐)

// 在全局作用域使用关键字声明
let strLet = "Dotcpp";
var strVar = "Dotcpp"; 
const strConst = "Dotcpp";
function myFunction() {
  console.log(strLet); // 可以在函数中访问全局变量
}
console.log(strLet); // 可以在函数外部访问全局变量

2. 隐式全局变量(不推荐)

// 非严格模式下,给未声明变量赋值会创建全局变量
function myFunction() {
  str = "Dotcpp"; // 隐式创建全局变量
}
myFunction();
console.log(str); // 输出:"Dotcpp"

关于严格模式:使用严格模式可以避免隐式全局变量的产生。(严格模式一般将字符串‘use strict’放在JS代码首行位置,其他地方无效)

'use strict';
function myFunction() {
  str = "Dotcpp"; // ReferenceError: str is not defined
}
myFunction();

所以,为了代码的可维护性和健壮性,建议始终使用关键字声明变量,避免使用隐式全局变量。

局部变量:

局部变量是在函数内部声明的变量,其作用域仅限于函数内部。局部变量在函数外部是不可访问的,主要用于存储和处理临时数据。

函数作用域(var)

使用 var 声明的变量是函数作用域:

function myFunction() {
  var localVar = "Dotcpp";
  if (true) {
    var localVar = "Changed"; // 同一个变量
    console.log(localVar); // 输出:"Changed"
  }
  console.log(localVar); // 输出:"Changed"(在整个函数内可见)
}
myFunction();
// console.log(localVar); // 报错:localVar is not defined

块级作用域(let/const)

使用 let 或 const 声明的变量是块级作用域:

function myFunction() {
  if (true) {
    let localLet = "Dotcpp";
    const localConst = "Hello";
    console.log(localLet); // 输出:"Dotcpp"
  }
  // console.log(localLet); // 报错:localLet is not defined
  // console.log(localConst); // 报错:localConst is not defined
}
myFunction();

不同关键字的作用域对比

function scopeComparison() {
  // var - 函数作用域
  if (true) {
    var varVariable = "var";
    let letVariable = "let";
  }
  console.log(varVariable); // "var"(可访问)
  // console.log(letVariable); // 报错(不可访问)
}

下面我们通过一张表格进行全局变量和局部变量的分类:

特性全局变量局部变量
声明位置函数外部函数内部
作用域整个程序仅限于函数/块内部
生命周期页面关闭前一直存在函数执行结束后销毁
访问性任何地方都可访问仅在声明的作用域内可访问

总结:掌握JS的基本概念,知道变量的作用域和生命周期,能够让我们更安全、更有条理地进行JS编码,提高代码质量。

点赞(136)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)