我非常了解JavaScript中的作用域和闭包的概念。
此外,以下站点提供了如何实现JavaScript命名空间的示例:
我仍然不明白的是,有多少人似乎混合了范围和命名空间的概念。此外,这些人还经常提到,人们不应“污染全局名称空间”,而不应“在全局范围内创建全局变量/变量”。
问题
let/const的块作用域)
bar创建了一个新的命名空间,避免污染全局名称空间(foo除外),但bar仍然处于全局范围:var foo = { bar: 42 },这是正确的吗?发布于 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中引用它们的用途。
https://stackoverflow.com/questions/50100317
复制相似问题