JavaScript变量的作用域介绍
JavaScript 变量的作用域决定了变量在代码中的可访问性。
var 是 JavaScript 中最早用于声明变量的关键字,它函数作用域或全局作用域。
let 关键字,具有块级作用域、全局作用域。
const关键字,具有块级作用域、全局作用域。
var、let 和 const 关键字对比表
特性 |
var |
let |
const |
作用域 |
函数作用域或全局作用域 |
块级作用域、全局作用域 |
块级作用域、全局作用域 |
变量提升 |
提升到作用域顶部,初始化为 undefined |
声明前访问会报错,因存在“暂时性死区”(Temporal Dead Zone) |
声明前访问会报错,因存在“暂时性死区”(Temporal Dead Zone) |
重复声明 |
合法,后续声明覆盖前一个值 |
不合法,抛出 SyntaxError |
不合法,抛出 SyntaxError |
是否可变 |
可变 |
可变 |
不可变(引用不可变,但内容可变)【注】 |
是否成为全局对象属性 |
是(在全局上下文中) |
否 |
否 |
【注:const 声明的变量不可重新赋值,但若为对象/数组,其内容可修改。示例:
const arr = [1, 2];
arr.push(3); // 允许
arr = [4, 5]; // 报错 】
下面展开介绍
1. 作用域类型
全局作用域(Global Scope)
- 定义:在函数外声明的变量。
- 特点:
- 任何地方都可访问,包括函数内部。过度使用全局变量可能导致命名冲突和代码难以维护。
- 在浏览器环境中,全局变量通常与 window 对象关联。
- 浏览器环境中,var 声明的全局变量会成为 window 对象(在浏览器环境中)的属性,let 和 const 不会。
- 注意
避免隐式全局变量,始终显式声明变量。
在非严格模式下,未使用 var、let 或 const 关键字声明的变量会被隐式提升为全局变量。
在严格模式下,未声明的变量会导致 ReferenceError,因此不会创建隐式全局变量。
var:在全局上下文中声明的变量会成为全局对象的属性,具有全局作用域。
let 和 const:在全局上下文中声明的变量是全局变量,但不会成为全局对象的属性; let 或 const 关键字还可以声明块级作用域(见后面)。
- 全局变量的创建方式:
1)隐式全局变量:
myGlobalVar = "Hello, World!"; // 隐式全局变量
console.log(myGlobalVar); // 输出 "Hello, World!"
console.log(window.myGlobalVar); // 输出 "Hello, World!",因为它是 window 的属性
2)显式全局变量: