首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript:命名空间与作用域

JavaScript:命名空间与作用域
EN

Stack Overflow用户
提问于 2018-04-30 12:13:47
回答 1查看 3.6K关注 0票数 8

我非常了解JavaScript中的作用域和闭包的概念。

此外,以下站点提供了如何实现JavaScript命名空间的示例:

  1. 你想知道的关于JavaScript范围的一切
  2. JavaScript中的名称起搏

我仍然不明白的是,有多少人似乎混合了范围和命名空间的概念。此外,这些人还经常提到,人们不应“污染全局名称空间”,而不应“在全局范围内创建全局变量/变量”。

问题

  • 范围和命名空间是两个完全不同的概念,这不是正确的吗?
    • 命名空间:代码分组,使组内的名称是唯一的,并且不能与其他名称空间中的类似名称发生冲突。
    • 作用域:定义变量的可访问性。JavaScript有两个作用域:全局作用域和局部/函数作用域(ES 2015引入了let/const的块作用域)

  • 以下对象文字为bar创建了一个新的命名空间,避免污染全局名称空间(foo除外),但bar仍然处于全局范围:var foo = { bar: 42 },这是正确的吗?
  • 说“不要创建全局变量,这样就不会污染全局名称空间”,这不是错误的吗?全局变量与局部变量(范围)与名称空间不同。正如所看到的,在新的命名空间中屏蔽变量是完全可能的,并且它仍然在全局范围内。
  • 如果避免污染全局命名空间是我们不应该创建全局变量的唯一原因,那么仅仅创建新的名称空间并仍然将其保持为全局还不够吗?
EN

回答 1

Stack Overflow用户

发布于 2018-04-30 13:22:01

范围和命名空间是两个完全不同的概念,这不是正确的吗?

我不会说作用域和名称空间是完全无关的。如果我们采用"命名空间“的字面意思,它是一个具有不同名称的空格 --正如您所说的,它是唯一的,并且不会与其他空间的名称发生冲突。

在这方面,作用域肯定会形成一个名称空间--变量名称是不同的,并且不会与其他作用域的名称发生冲突。但是,一个作用域是内部的,不能从外部访问,所以它对组织事物并不特别感兴趣。

对象还形成名称空间-属性名称是不同的,并且不会与其他对象上的名称发生冲突。这就是为什么使用对象将代码构造成模块的原因,这也是JavaScript中“命名空间”的传统含义。

以下对象文字为bar创建了一个新的命名空间,避免污染全局名称空间(foo除外),但bar仍然处于全局范围:var foo = { bar: 42 },这是正确的吗?

不,bar不是全局范围的成员。它是某个物体的属性。

说“不要创建全局变量,这样就不会污染全局名称空间”,这不是错误的吗?全局变量与局部变量(范围)与名称空间不同。

Globals在JS中有点特殊:它们既是全局对象的属性,也是全局范围中的变量。这就是为什么我们谈论“全局命名空间”来包含所有--特别是强调名称不能相互冲突。

如果避免污染全局命名空间是我们不应该创建全局变量的唯一原因,那么仅仅创建新的名称空间并仍然将其保持为全局还不够吗?

创建名称空间(如上面示例中的{bar: 42} )仍然会创建全局变量:foo。它只是创建了更少的变量-每个模块一个。此外,它还创建了一个特定的命名约定,即全局变量应该引用模块,而不是普通变量。我们不会使用var i, increment, decrement;,而是使用var counter = {i: …, increment(){…}, decrement(){…}};,并在名称counter中引用它们的用途。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50100317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档