Mag*_*nus 5 javascript scope namespaces
我对 JavaScript 中的作用域和闭包的概念有很好的理解。
此外,以下站点提供了如何实现 JavaScript 命名空间的示例:
我仍然不明白的是,似乎有多少人混淆了作用域和命名空间的概念。此外,同样的人还经常提到如何不“污染全局命名空间”而不是“在全局范围内创建全局变量/变量”。
问题
let/ 的块作用域const)bar避免污染全局命名空间(除了foo),但它bar仍然在全局范围内:var foo = { bar: 42 }\n\n\n范围和命名空间是两个完全不同的概念,这不是正确的吗?
\n
我不会说作用域和命名空间完全无关。如果我们按照“命名空间”的字面意思来看,它就是一个空间- 唯一且不会与其他空间的名称发生冲突,正如您所说。
\n\n在这方面,作用域肯定形成了一个名称空间 - 变量名称是不同的,并且不会与其他作用域的名称冲突。但是,范围是内部的,无法从外部访问,因此对于组织事物来说并不是特别有趣。
\n\n对象还形成名称空间 - 属性名称是不同的,并且不会与其他对象上的名称冲突。这就是为什么使用对象将代码构造成模块,这也是 JavaScript 中“命名空间”的传统含义。
\n\n\n\n\n\n
bar以下对象字面量为 创建一个新的命名空间,避免污染全局命名空间(除了foo),但它bar仍然在全局范围内,是否正确:var foo = { bar: 42 }
不,bar不是全局范围的成员。它是某个对象的属性。
\n\n\n难道说“不要创建全局变量,这样就不会污染全局命名空间”吗?全局变量与局部变量(范围)与命名空间不同。
\n
全局变量在 JS 中有点特殊:它们既是全局对象的属性,也是全局范围内的变量。这就是为什么我们谈论“全局命名空间”来涵盖所有内容 - 并且特别强调名称不得冲突。
\n\n\n\n\n如果避免污染全局命名空间是我们不应该创建全局变量的唯一原因,那么仅仅创建新的命名空间并仍然保持全局变量还不够吗?
\n
创建命名空间,就像{bar: 42}上面的示例一样,仍然会创建全局变量:foo。它只是创建更少的变量——每个模块一个。它还创建了一定的命名约定,即全局变量应该引用模块而不是普通变量。我们不会使用var i, increment, decrement;but var counter = {i: \xe2\x80\xa6, increment(){\xe2\x80\xa6}, decrement(){\xe2\x80\xa6}};,并在名称中提及它们的用途counter。
| 归档时间: |
|
| 查看次数: |
2569 次 |
| 最近记录: |