Javascript - 在对象中存储函数 - 不好的做法? [关闭]
Posted
技术标签:
【中文标题】Javascript - 在对象中存储函数 - 不好的做法? [关闭]【英文标题】:Javascript - Storing function in object - bad practice? [closed] 【发布时间】:2012-02-12 17:35:12 【问题描述】:将函数存储在对象中而不是仅仅定义它们(因此是全局的)是否被认为是不好的编码实践?
考虑:
1.
Foo =
bar: function()
alert("baz");
Foo.bar();
对比
2.
function bar()
alert("baz");
bar();
当然,第二个示例的代码可能会稍微少一些,但是当您开始获得大量功能时 - 它会变得一团糟。
例如,我发现使用 Game.update()
而不是使用 updateGame();或类似的。当更深入时,例如Game.notify.admin(id)
等,它会为您提供更漂亮的代码。
在对象中存储函数有什么缺点吗?
【问题讨论】:
没有。如果有的话,在全球拥有数百万用户的框架就不会这样做了。 没有。正如您的问题已经指出的那样,这是避免全球污染的标准命名空间。为什么会不好? 【参考方案1】:首选第一种方法。这样,您就可以显式定义函数的范围,而不是污染全局范围。使用第一种方法没有缺点。只有好处:-)
结论:总是使用第一种方法来定义函数。第二个就像 90 年代的 javascript,让我们让它回到过去并使用适当的范围。
【讨论】:
积极嵌套有一些缺点。例如,将 functions 放在对象上“因为它更好”是愚蠢的。 (将函数放在全局范围内也是愚蠢的,但这不是正在处理的,假设模块范围)。嵌套超过 4 层的对象和函数也很愚蠢。理想情况下,您的对象/方法链需要一层或两层foo.bar.baz()
真的与范围有关吗?还是只是减少全局变量的数量以减少重复变量名的机会。 “全球污染”是否有任何其他副作用?
@RobG 可维护性。尝试将全局变量的数量减少到零有很多充分的理由。
@RobG 这不是关于冲突,而是关于确保代码不会因破坏全局状态而意外破坏不变量。在大型项目中,您只是不想要全局状态,而是依赖于全局状态未损坏的约定。
@PhilOlson — 仅将值存储在对象中与使用变量相比没有任何好处。如果需要模块化(并且模块化是一个好主意),那么就有模块模式,它只公开那些需要公开的属性,并将其余的隐藏在单独的执行上下文中。【参考方案2】:
在这种特定情况下,请使用第一个。但是,如果您的 Foo 对象变得非常复杂,您可能希望使用另一种方法,让您有机会使用构造函数。当涉及到函数的范围时,第一种方法有时也不是最好的:
function Foo(appName)
this.name = appName;
Foo.prototype.Bar = function()
alert(this.name)
var a = new Foo("baz");
a.Bar();
【讨论】:
检测到反模式。请使用原型,谢谢。 你说得对@Raynos,在函数内部声明函数的问题是每次启动类时都会重新创建它。【参考方案3】:命名空间对象没有什么神奇之处,如果您使用大量全局变量,您也不一定会遇到任何问题。 使用“命名空间”对象的主要原因是减少重复全局变量名称的可能性。第二个原因是为了方便将相似的函数组合在一起,例如:
// Object example (suggested best practice):
// DOM functions are under myLib.dom
myLib.dom.someDOMFunction0;
myLib.dom.someDOMFunction1;
// Utility functions are under myLib.util
myLib.util.someUtilityFunction0;
myLib.util.someUtilityFunction1;
请注意,以上内容与类似的全局变量实际上具有相同的重复机会:
// Global variable example:
myLib_dom_someDOMFunction0;
myLib_dom_someDOMFunction1;
myLib_util_someUtilityFunction0;
myLib_util_someUtilityFunction1;
当然,前者通常更受欢迎,因为它看起来更容易使用。我并不是提倡你采用第二种方法(我使用第一种),只是指出虽然创建大量全局变量存在问题,但所谓的“全局命名空间污染”被严重高估为一种危险。
【讨论】:
以上是关于Javascript - 在对象中存储函数 - 不好的做法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章