javascript - 为什么命名空间在 JavaScript 中被认为是不好的做法?

标签 javascript namespaces

<分区>

有人告诉我不应该使用 namespace ,因为它们“污染”了全局范围。我想知道有哪些替代方案?

当我想定义效用函数和/或常量时,例如对于网站,一种简单的方法是通过 namespace 定义它们,这样对全局范围的损害仅限于一个对象。

如果 namespace 是不好的做法,我会想到几个问题:

  1. 为什么这是不好的做法?
  2. 此声明的范围是什么(网络应用程序/动态网站/静态网站等)?
  3. 有哪些替代方案?

这个问题是在 a post on the benefits of using extend.js 上开始的讨论的结果.

最佳答案

why is this bad practice?

命名空间本身是不好的,因为它是一个不必要的概念。

拥有具有属性和方法的对象是可以接受的。拥有一个类似于“命名空间”的“模块” token 也很好,但意思是每个文件都有一个“模块” token ,其中包含您的所有属性和方法。这与“命名空间”不同,因为它仅在单个文件中创建/更改,不会作为全局 token 公开。

what's the scope of this declaration (web applications / dynamic websites / static websites etc.)?

所有 ECMAScript,从不创建新的全局 token

what are the alternatives?

与其使用命名空间,不如使用多个“本地文件”标记。这意味着每个文件/“模块”都应该被包裹在一个闭包中,并且您应该可以访问这个闭包内的多个局部变量。

全局变量也很糟糕,因为您根本不需要它们。避免全局变量的方法是将所有内容包装在闭包中,并智能地加载外部 javascript 文件。

零全局模块加载器的例子

进一步阅读:

关于javascript - 为什么命名空间在 JavaScript 中被认为是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10054125/

相关文章:

javascript - Javascript Ajax 会导致死锁吗?

javascript - onclick 不会让我将 div 显示设置为隐藏,将另一个设置为内联,当隐藏注释掉时,内联工作一次

python - 执行 `from abc import xyz` 模块 `abc`去哪了?

c++ - 使用 LASlib 时重新定义 BOOL typedef

xslt - 选择具有默认命名空间的节点

c++ - C++ 声明中的显式限定

javascript - jstree 中 dnd 插件中的拖放事件未被调用

javascript - OnClick 突然无法在 Chrome 中的 Google 协作平台上运行

java - 在 Java DOM 中创建命名空间前缀的 XML 节点

javascript - 检查数组对象中的输出是否有 'error' 并在 'error' 中显示消息