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 - 在对象中存储函数 - 不好的做法? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSON 中存储 javascript 函数

JavaScript--函数-01

JavaScript中一个对象中的默认破坏函数参数

0136 JavaScript中 arguments 的使用

JavaScript基础之函数和变量作用域

《高性能Javascript》读书笔记-2