【发布时间】:2018-10-10 12:53:45
【问题描述】:
我对 JavaScript 中作用域和闭包的概念有相当好的把握。
此外,以下网站提供了如何实现 JavaScript 命名空间的示例:
我仍然不明白的是有多少人似乎混合了范围和命名空间的概念。此外,同样的人还经常提到不应该“污染全局命名空间”而不是“在全局范围内创建全局变量/变量”。
问题
- 作用域和命名空间是两个完全不同的概念,这不正确吗?
- 命名空间:对代码进行分组,使组内的名称是唯一的,并且不能与其他命名空间中的相似名称发生冲突
- 范围:定义变量的可访问性。 JavaScript 有两个作用域,全局作用域和本地/函数作用域(ES 2015 引入了块作用域,
let/const)
- 下面的对象字面量为
bar创建一个新的命名空间,避免污染全局命名空间(foo除外)是否正确,但bar仍在全局范围内:var foo = { bar: 42 } - 说“不要创建全局变量,以免污染全局命名空间”是不是错了?全局变量与局部变量(范围)与命名空间不同。正如所见,完全有可能在一个新的命名空间中屏蔽一个变量,并且仍然让它在全局范围内。
- 如果避免污染全局命名空间是我们不应该创建全局变量的唯一原因,那么仅仅创建新的命名空间并使其保持全局性还不够吗?
【问题讨论】:
-
现代 JavaScript 也通过
let和const声明具有 block 范围。 -
@Pointy True,更新了帖子。
标签: javascript scope namespaces