Javascript – 在对象中存储函数 – 不好的做法?

将函数存储在对象中而不是仅仅定义它们(因此是全局的),这被认为是不好的编码实践吗?

考虑:

1。

Foo = { bar: function() { alert("baz"); } } 

Foo.bar();

2。

 function bar() { alert("baz"); } 

bar();

当然,第二个例子的代码可能会稍微less一点,但是当你开始获得很多function的时候,它会变得混乱。 我觉得它的方式,更清洁,例如,使用Game.update()而不是使用updateGame(); 或类似的。 当更深入时,像Game.notify.admin(id)等,它会给你更漂亮的代码。

将函数存储在对象中是否有任何缺点?

第一种方法是首选。 这样你就明确地定义了函数的作用域而不是污染全局作用域。 使用第一种方法没有缺点。 只有上升:-)

结论:始终使用第一种方法来定义函数。 第二个就像是在90年代的javascript,让我们把它放回原来的安静,并使用适当的范围。

命名空间对象没有魔法,如果使用大量的全局variables,也不会有任何问题。 使用“名称空间”对象的主要原因是为了减less重复的全局variables名的可能性。 第二个原因是为了方便将类似的function组合在一起,例如:

 // 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; 

请注意,上面几乎有相同的全局variables重复的机会:

 // Global variable example: myLib_dom_someDOMFunction0; myLib_dom_someDOMFunction1; myLib_util_someUtilityFunction0; myLib_util_someUtilityFunction1; 

当然,前者通常是首选,因为它看起来更容易处理。 我不是主张采用第二种方法(我使用第一种方法),只是指出虽然在创build大量全局variables时存在一个问题,但所谓的“全局命名空间污染”作为一个危险被高估。

在这个特定的情况下去第一个。 但是如果你的Foo对象变得非常复杂,你可能需要使用另外一种方法来给你一个使用构造函数的机会。 当涉及到函数的范围时,第一种方法有时并不是最好的:

 function Foo(appName){ this.name = appName; } Foo.prototype.Bar = function(){ alert(this.name) } var a = new Foo("baz"); a.Bar();