
文章目錄1. 核心概念global 與 globalThis2. 最重要的區別模塊作用域3. 真正的全局對象 / 變量4. 看起來像全局其實不是的變量5. 最常用的全局對象process6. 如何正確使用全局變量建議7. 總結在瀏覽器中全局對象是window在 Node.js 中對應的是global。但 Node.js 的全局變量體系和瀏覽器有很大區別尤其是在模塊作用域方面。1. 核心概念global與globalThis名稱說明推薦程度globalNode.js 特有的全局對象舊寫法不推薦新代碼使用globalThisES2020 標準跨環境統一訪問全局對象推薦使用// 兩者在 Node.js 中指向同一個對象console.log(globalglobalThis);// true2. 最重要的區別模塊作用域在瀏覽器中vara1;// 自動變成 window.a在 Node.js 中vara1;// 只是當前模塊的局部變量不會變成 global.aconsole.log(global.a);// undefined原因Node.js 每個文件都被包裝成一個模塊函數類似這樣(function(exports,require,module,__filename,__dirname){// 你的代碼寫在這里vara1;// 只在這個函數作用域內});所以想讓變量真正變成全局必須顯式掛載global.myVar我是全局變量;// 或者globalThis.myVar我是全局變量;其他文件中就可以直接訪問console.log(global.myVar);// 我是全局變量3. 真正的全局對象 / 變量以下這些是真正全局可用的不需要 require名稱說明global/globalThis全局對象本身console控制臺輸出process當前進程信息非常常用Buffer處理二進制數據setTimeout/setInterval定時器setImmediate/clearImmediateNode.js 特有的立即執行定時器queueMicrotask微任務隊列URL/URLSearchParamsURL 處理TextEncoder/TextDecoder文本編碼performance性能相關fetch較新版本網絡請求4. 看起來像全局其實不是的變量這些變量只在當前模塊內可用并不是真正的全局變量說明__dirname當前文件所在目錄的絕對路徑__filename當前文件的絕對路徑module當前模塊對象exportsmodule.exports的快捷方式require引入其他模塊的函數console.log(__dirname);// 當前目錄路徑console.log(__filename);// 當前文件完整路徑5. 最常用的全局對象processprocess是 Node.js 中最重要的全局對象之一// 環境變量console.log(process.env.NODE_ENV);console.log(process.env.PATH);// 命令行參數console.log(process.argv);// 當前工作目錄console.log(process.cwd());// 退出程序process.exit(0);// 監聽退出事件process.on(exit,(code){console.log(進程即將退出退出碼,code);});6. 如何正確使用全局變量建議不推薦隨便掛全局變量// 不推薦global.config{port:3000};推薦做法使用模塊導出最推薦// config.jsmodule.exports{port:3000,dbUrl:mongodb://localhost/test};// 其他文件constconfigrequire(./config);使用環境變量適合配置、密鑰// 通過 .env 或系統環境變量設置console.log(process.env.DB_PASSWORD);必須用全局時統一掛到一個命名空間下globalThis.App{config:{...},utils:{...}};7. 總結對比項瀏覽器Node.js全局對象windowglobal/globalThisvar聲明自動變成全局不會變成全局模塊作用域無原生模塊每個文件都是獨立模塊推薦訪問方式window/globalThisglobalThis核心記憶點Node.js 中默認沒有“隨便寫就變成全局”的行為真正全局的東西要用global/globalThis顯式掛載絕大多數情況下優先用模塊導出 require/import而不是依賴全局變量 感謝閱讀想了解更多 我的博客網站 | 記錄思考分享干貨 我的個人主頁 | 關于我、開源項目