为什么命名空间在JavaScript中被认为是不好的做法?
我被告知命名空间不应该被使用,因为它们“污染”了全球范围。 我想知道什么是替代品?
当我想为例如网站定义实用函数和/或常量时,一个简单的方法是按名称空间定义它们,这样全局范围的损害仅限于一个对象。
如果命名空间是不好的练习,就会想到几个问题:
这个问题是从一篇关于使用extend.js的好处开始讨论的结果。
为什么这是不好的做法?
命名空间本身是不好的,因为这是一个不必要的概念。
具有属性和方法的对象是可以接受的。 具有类似于“命名空间”的“模块”令牌也很好,但是含义是每个文件都有一个包含所有属性和方法的“模块”令牌。 这与“命名空间”不同,因为它只在单个文件中创建/更改,并且不作为全局令牌公开。
这个声明的范围是什么(Web应用程序/动态网站/静态网站等)?
所有ECMAScript,从不创建新的全局令牌
有什么选择?
而不是有命名空间,你应该支持多个“文件本地”令牌。 这意味着每个文件/“模块”应该封装在闭包中,并且您应该可以访问该闭包中的多个局部变量。
全局变量也很糟糕,因为你根本不需要它们。 您避免使用全局变量的方式是将所有内容封装在闭包中,并在加载外部JavaScript文件方面具有智能性。
零全局模块加载器的示例
进一步阅读:
我无法想象为什么命名空间会是一件坏事。 除非有一些特定于JavaScript的名称空间的定义,我不知道。
我目前正在研究一个小型库,并且所有东西都被一个顶级对象(命名空间?)所包围。 我不把任何东西放在窗口或内在类型上; 如果你需要从我的图书馆得到一些东西,它可以在kilo
对象中使用。
对我来说,拥有这个'名字空间'是一个好习惯,因为如果我在库中调用一个方法,它会让我很快知道。 无需重写window.alert
方法,该方法可能会与装载在页面上的另一个库一起使用; 只需使用kilo.alert
作为定制版本(这是一个人为的例子,但我希望它能说明问题)。
就我个人而言,我认为那些说你永远不会污染全球范围的人不能正确定义“污染”。 例如,您可以在本机Math
对象中看到这一点。 我知道的其他所有编程语言都具有所有的数学函数,只是普通的函数,但JS没有。 但是,如果你想把它core.dialog.alert
极端,例如,一个简单的警告框就是core.dialog.alert
。
我喜欢把所有的代码放在闭包中,以保持变量的清洁。 但是,我的主JS脚本文件在全局范围内定义了一些效用函数,例如自定义Alert()
或AJAX()
或其他广泛使用的函数。 如果我打算经常使用它们,我不希望使用命名空间调用来扩展文件。 因为我在闭包中定义了所有的变量,所以没有意外覆盖函数的风险(我可能会在闭包本身中这样做,但它对全局范围没有影响)。
总体而言,名称空间被高估。 只需编写你的代码,不要为每一个window
属性哭泣。
上一篇: Why are namespaces considered bad practice in JavaScript?
下一篇: Declaring variables inside loops, good practice or bad practice?