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

我被告知命名空间不应该被使用,因为它们“污染”了全球范围。 我想知道什么是替代品?

当我想为例如网站定义实用函数和/或常量时,一个简单的方法是按名称空间定义它们,这样全局范围的损害仅限于一个对象。

如果命名空间是不好的练习,就会想到几个问题:

  • 为什么这是不好的做法?
  • 这个声明的范围是什么(Web应用程序/动态网站/静态网站等)?
  • 有什么选择?
  • 这个问题是从一篇关于使用extend.js的好处开始讨论的结果。


    为什么这是不好的做法?

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

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

    这个声明的范围是什么(Web应用程序/动态网站/静态网站等)?

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

    有什么选择?

    而不是有命名空间,你应该支持多个“文件本地”令牌。 这意味着每个文件/“模块”应该封装在闭包中,并且您应该可以访问该闭包中的多个局部变量。

    全局变量也很糟糕,因为你根本不需要它们。 您避免使用全局变量的方式是将所有内容封装在闭包中,并在加载外部JavaScript文件方面具有智能性。

    零全局模块加载器的示例

  • 节点browserify
  • webmake
  • modul8
  • 进一步阅读:

  • 没有全局的模块化
  • CommonJS模块

  • 我无法想象为什么命名空间会是一件坏事。 除非有一些特定于JavaScript的名称空间的定义,我不知道。

    我目前正在研究一个小型库,并且所有东西都被一个顶级对象(命名空间?)所包围。 我不把任何东西放在窗口或内在类型上; 如果你需要从我的图书馆得到一些东西,它可以在kilo对象中使用。

    对我来说,拥有这个'名字空间'是一个习惯,因为如果我在库中调用一个方法,它会让我很快知道。 无需重写window.alert方法,该方法可能会与装载在页面上的另一个库一起使用; 只需使用kilo.alert作为定制版本(这是一个人为的例子,但我希望它能说明问题)。


    就我个人而言,我认为那些说你永远不会污染全球范围的人不能正确定义“污染”。 例如,您可以在本机Math对象中看到这一点。 我知道的其他所有编程语言都具有所有的数学函数,只是普通的函数,但JS没有。 但是,如果你想把它core.dialog.alert极端,例如,一个简单的警告框就是core.dialog.alert

    我喜欢把所有的代码放在闭包中,以保持变量的清洁。 但是,我的主JS脚本文件在全局范围内定义了一些效用函数,例如自定义Alert()AJAX()或其他广泛使用的函数。 如果我打算经常使用它们,我不希望使用命名空间调用来扩展文件。 因为我在闭包中定义了所有的变量,所以没有意外覆盖函数的风险(我可能会在闭包本身中这样做,但它对全局范围没有影响)。

    总体而言,名称空间被高估。 只需编写你的代码,不要为每一个window属性哭泣。

    链接地址: http://www.djcxy.com/p/5061.html

    上一篇: Why are namespaces considered bad practice in JavaScript?

    下一篇: Declaring variables inside loops, good practice or bad practice?