什么是 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+ 浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告