JavaScript 全局变量详解
在 JavaScript 中,全局变量是指可以在代码的任何位置(包括函数、模块或其他作用域)访问的变量。以下是关键知识点和注意事项:
1. 全局变量的定义方式
(1) 显式全局变量(不推荐)
在函数或块作用域外声明,或直接给未声明的变量赋值(非严格模式):
var globalVar = "我是全局变量"; // 通过 var 声明
globalVar2 = "我也是全局变量"; // 隐式全局(严格模式下报错)
(2) 挂载到全局对象
- 浏览器环境:变量会成为
window
的属性。 - Node.js 环境:变量会成为
global
的属性。
window.browserGlobal = "我在浏览器中是 window.browserGlobal";
global.nodeGlobal = "我在 Node.js 中是 global.nodeGlobal";
2. 全局变量的风险
(1) 命名冲突
多个脚本使用同名全局变量时,后者会覆盖前者:
// script1.js
var utils = { version: "1.0" };
// script2.js
var utils = { version: "2.0" }; // 覆盖 script1.js 的 utils
(2) 污染作用域
意外创建的隐式全局变量可能导致难以调试的问题:
function leak() {
leakedVar = "我泄露到了全局!"; // strict 模式下报错
}
leak();
console.log(leakedVar); // "我泄露到了全局!"
3. 如何避免全局污染?
(1) IIFE(立即执行函数表达式)
创建一个独立的作用域:
(function() {
var localVar = "我不会污染全局";
})();
console.log(localVar); // ReferenceError: localVar is not defined
(2) ES6 let
/const
+ 块级作用域
限制变量的作用范围:
{
const localConst = "仅在块内有效";
let localLet = "同样受限";
}
console.log(localConst); // ReferenceError
(3) Module(ES6 Modules)
通过 import/export
隔离作用域:
// module.js
export const privateData = "仅模块内可用";
// main.js
import { privateData } from './module.js';
console.log(privateData); // OK,不会污染其他文件
4. JavaScript内置的全局对象/属性
名称 | 用途 |
---|---|
window |
浏览器中的顶层对象 |
global |
Node.js中的顶层对象 |
document |
DOM操作入口 |
console |
debug输出 |
setTimeout |
定时器 |
Math , JSON |
工具库 |
5. Strict Mode(严格模式)的限制
启用严格模式后,意外创建全局变量会抛出错误:
"use strict";
accidentalGlobal = "报错!"; // ReferenceError: accidentalGlobal is not defined
启用方式:在脚本或函数顶部添加 "use strict"
。
总结建议
- ✅ 优先使用模块化开发(ES Modules)。
- ✅ 用
let
/const
替代var
。 - ❌ 避免直接使用隐式全局变量。
- 🔧 必要时通过命名空间组织代码:
const MyApp = {}; MyApp.utils = { /* ... */ };
如果有具体场景问题,欢迎进一步讨论!
内容由零声教学AI助手提供,问题来源于学员提问