什麼是 JavaScript 中的全域性名稱空間汙染?


全域性名稱空間汙染

汙染全域性名稱空間會導致**名稱衝突**。這種**名稱衝突**在大型專案中非常常見,因為我們可能使用多個**javascript**庫。讓我們詳細討論什麼是**名稱衝突**。

讓我們來看一個場景,其中兩個團隊 A1 和 A2 正在開發一個專案。他們都準備了自己的 javascript 檔案,即**TeamA1.js** 和**TeamA2.js**,如下所示。

TeamA1.js

**TeamA1** 建立了一個學生函式,並有兩個引數 fname 和 lname(名字和姓氏)。

function student(fname, lname){
   this.fname = fname;
   this.lname = lname;
   this.getFullName = function (){
      return this.fname + " " + this.lname
   }
}

TeamA2.js

**TeamA2** 建立了相同的函式(student),並有三個引數 fname、mname、lname。

function student(fname, mname, lname){
   this.fname = fname;
   this.mname = mname;
   this.lname = lname;
  this.getFullName = function (){
      return this.fname + " " + this.mname + " " + this.lname;
   }
}

現在建立一個 html 檔案來操作上述 js 檔案。將 js 檔案放在<head>標籤中。

Html 檔案

<html>
<head>
<script type = "javascript" src = "TeamA1.js"></script>
<script type = "javascript" src = "TeamA2.js"></script>
</head>
<body>
   <div id = "resultDiv"></div>
   <script>
      document.getElementById("resultDiv").innerHTML =
      new student("Rajendra", "prasad").getFullName();
   </script>
</body>
</html>

如果我們執行程式碼,將顯示以下輸出。

輸出

Rajendra prasad undefined

解釋

這裡我們有兩個學生函式,一個有 2 個引數,另一個有 3 個引數。我們的目標是使用具有 2 個引數的學生函式,因此在**html 檔案**中只傳遞了兩個引數(“Rajendra”,“prasad”)。但我們得到的輸出是“Rajendra prasad undefined”,這意味著程式碼使用了具有 3 個引數的函式而不是具有 2 個引數的函式。

其背後的原因是 javascript 不會鼓勵**函式過載**。它只是用另一個具有相同名稱的函式(這裡為 student)**覆蓋**該函式。在我們的示例中,由於具有 3 個引數的函式(TeamA2.js)放在具有 2 個引數的函式(TeamA1.js)之後,**TeamA2** 函式覆蓋了**TeamA1** 函式,在輸出中顯示**undefined**。如果兩個 js 檔案的位置反過來,則輸出將為“Rajendra prasad”。

在這裡,我們可以說發生了**名稱衝突**。這兩個團隊都構建了一個同名的函式,即 student。因此,不要將所有內容都新增到全域性名稱空間中非常重要。如果其他人使用相同的變數或函式名,可能會導致**名稱衝突**。

更新於:2020-06-29

1K+ 瀏覽量

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告