什麼是 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。因此,不要將所有內容都新增到全域性名稱空間中非常重要。如果其他人使用相同的變數或函式名,可能會導致**名稱衝突**。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP