JavaScript >> Javascript 文檔 >  >> Node.js

在 Node.js 中使用全局變量

​大家好,在今天的文章中,我想談談 Node.js 中的全局變量。本文面向使用 Node.js 的初級到中級技能水平的開發人員。如果您從未聽說過或使用過全局變量,則無需擔心。本文將幫助您快速掌握有關全局變量的所有知識。

什麼是全局變量?

全局變量與常規變量非常相似,如果不相同的話。全局變量可以用一個值初始化,該值可以改變,甚至可以像普通變量一樣被清除。常規變量和全局變量之間的區別歸結為它們的範圍。當您在 JavaScript 文件中創建變量時,該變量僅存在於聲明它的範圍內。現在我的意思是什麼?在下面的代碼中,您可以看到兩個不同範圍的不同變量的示例。

// Scope.js

let fileScope = "Can be accessed anywhere in the file";

function doSomething() {
    let localScope = "Can only be accessed inside this function";
    fileScope = "Can be accessed in the function too!";
}

// This will result in an error because the variable does not exist
// outside the function.
localScope = "Try and change me here";

在上面的代碼片段中,我們可以看到有兩個變量,fileScopelocalScope .變量 fileScope 可以在此文件中的任何位置更改或調用,而 localScope 變量只存在於函數doSomething()中 .我敢肯定,此時您想知道這與全局變量有什麼關係。當我們談論全局變量時,它們存在於程序中的所有文件中,這意味著它們具有程序的全局範圍。

這可能是因為 JavaScript 程序在程序中的所有文件之間共享一個全局命名空間。換句話說,假設您的程序是一個巨大的文件或容器,它“導入”了所有其他 JavaScript 文件。然後在這個大容器文件中聲明一個變量,該變量現在具有整個程序的範圍。如果您不確定命名空間是什麼,或者您想了解更多關於它們的信息,請查看這篇文章以了解更多信息。

如何聲明和使用全局變量

既然我們對 Node 中的全局變量是什麼有了更好的理解,那麼讓我們來談談我們實際上是如何設置和使用全局變量的。要設置全局變量,我們需要在全局對像上創建它。全局對象為我們提供了整個項目的範圍,而不僅僅是創建變量的文件(模塊)。在下面的代碼塊中,我們創建了一個名為 globalString 的全局變量 我們給它一個值。接下來,我們改變globalString的值 ,最後我們將其設置為 undefined。

// Global.js

global.globalString = "This can be accessed anywhere!";
console.log(globalString); // Output: "This can be accessed anywhere!"

globalString = "Check me out now";
console.log(globalString); // Output: "Check me out now"

globalString = undefined;
console.log(globalString); // Output: undefined
// Example.js
 
// We can use the global we created in Global.js in this file 
// as well.
console.log(globalString); // Output: undefined
 
globalString = “We can change it too!"; 
console.log(globalString); // Output: "We can change it too!"

我還沒有談論的是另一種可以使變量全局化的方法。我排除這個的原因是因為它不是設置變量的正確方法。如果您在文件中聲明變量而不使用關鍵字 var 然後給它賦值,全局對象會為這個變量設置一個屬性。這個過程本質上把它變成了一個全局可訪問的變量。我強烈建議不要使用這種方法,因為它不是創建全局變量的正確方法。還需要注意的是,如果您設置 'use strict' 指令,Node 將禁用隱式全局變量,您可能會在運行時出現錯誤而不是工作腳本。

全局變量的實際用例

現在,您可能會想,既然您對全局變量了解得更多,就想開始創建全局變量。出於幾個非常重要的原因,我將強烈警告不要創建全局變量。

第一個原因是當你創建一個全局變量時,它存在於應用程序的整個生命週期中。當一個變量在應用程序的整個生命週期中持續存在時,這意味著它在內存中,在應用程序運行時佔用資源。

其次,傳統上使用全局變量會導致並發問題。如果多個線程可以訪問同一個變量並且沒有適當的訪問修飾符或故障保護,則可能導致兩個線程嘗試訪問和使用同一個變量的一些嚴重問題。 然而 ,雖然在其他語言中是這種情況,但 Node.js 不一定是這種情況,因為它是嚴格的單線程環境。雖然它 可以集群 Node 進程,但它們之間沒有本地通信方式。

我要討論的最後一個原因是使用全局變量會導致文件或變量之間的隱式耦合。在編寫出色的代碼時,耦合併不是一件好事。在編寫代碼時,我們希望確保它盡可能模塊化和可重用,同時還要確保它易於使用和理解。當您嘗試調試某些不工作的原因時,將代碼片段耦合在一起可能會導致一些嚴重的問題。

如果您想進一步了解為什麼不推薦使用全局變量,可以查看這篇名為 Global Variables Are Bad 的精彩文章。

如果您對全局變量的用途感到困惑,請不要害怕。我們將看一下 Node 中內置的一些全局變量,並嘗試更好地理解它們為何是全局的以及如何使用它們。事實上,您可能已經使用了其中的一些,甚至沒有意識到它們是全局對象!

免費電子書:Git Essentials

查看我們的 Git 學習實踐指南,其中包含最佳實踐、行業認可的標準以及隨附的備忘單。停止谷歌搜索 Git 命令並真正學習 它!

// Node Globals

console.log("Hello World!");

process.env.PORT = 3000;

setInterval({
  console.log("2 seconds passed.");
}, 2000);

如果您查看上面的代碼塊,您可能會看到至少一個您以前使用過的實例,console.log() .根據 Node 文檔,控制台對像是一個全局對象,它有一些方法允許開發人員執行諸如打印日誌或錯誤之類的操作。深入研究文檔,我們可以看到 console 實際上是一個配置為寫入 process.stdout 的全局實例 和 process.stderr .

這將我們帶到您在上面的代碼塊中看到的下一個語句,process 目的。如果您已經建立了 Node 應用程序的生產版本,那麼您可能必須為環境變量設置端口。環境變量 envprocess 的一部分 另一個全局對象。您可以訪問 process 上的變量 項目中任何文件中的對象,因為它是全局的。如果這個對像不是全局的,console 對像也不能從任何文件訪問,記住它實際上是一個引用回 process 的對象 對象。

setInterval 如果您有理由在執行操作之前延遲操作,您可能會看到另一個功能。 setTimeoutsetImmediate 本質上類似於 setInterval 並且都是全局函數。這三個函數是 timer 模塊的一部分,它公開了一個全局 API,允許您調用這些函數而無需在文件中明確要求 timer。

​所有上述用例都內置在 Node 中,並且出於某種原因是全球性的。 process object 是全局的,因為它提供了有關當前運行的 Node 進程的信息,因此應該可以從任何文件中獲得,而不必要求它。定時器模塊也是如此,它包含許多重要的功能,並且應該可以在任何地方訪問而無需它。如果您想了解更多關於 Node 中內置的現有全局對象的信息,我鼓勵您訪問 Globals 的官方文檔。

了解更多

想了解更多關於 Node.js 的基礎知識嗎?就個人而言,我會推荐一門在線課程,例如 Wes Bos 的 Learn Node.js,因為這些視頻更容易上手,而且您實際上可以構建一個真實世界的應用程序。

結論

我知道這是相當多的信息,所以謝謝你堅持下去。以上所有信息都可以在 Node 網站上的文檔中找到。請隨時在下面的評論部分提出問題並發表評論。直到下一次!


Tutorial JavaScript 教程
  1. JavaScript Web Workers 和非主線程任務入門

  2. 下面是我在 ReactJS 和 Firebase 中製作實時聊天框的方法

  3. 在 MooTools 1.2 中實現類似 jQuery 的“點擊”語法

  4. 使用 RNN 和馬爾可夫鏈的數據驅動前端開發

  5. Firebase 數據庫。如何將值附加到數組?

  6. #30DaysOfAppwrite:Docker Swarm 集成

  7. ReactJS、ReactNative 和 Node 的最佳課程

  1. Selenium 4.0 - 主要變化

  2. 鼠標點擊觸發鼠標離開

  3. JAMstack 與 Gatsby 和 Netlify

  4. Map()、Filter() 和 Reduce()

  5. React Native 應用程序中的動態離線存儲

  6. 使用 useForm 構建表單

  7. 將 Snapchat 的 Bitmoji 添加到您的網站

  1. JavaScript 數組填充 |方法

  2. 通過構建項目學習 Javascript(免費!)

  3. 使用 Express 開始使用 Fauna 和 Node.js

  4. 宣布 Stylo - 另一種富文本編輯器