将函数存储在对象中而不仅仅是定义它们(因此是全局的),它被认为是错误的编码实践吗?
考虑:
1
Foo = {
bar: function() {
alert("baz");
}
}
Foo.bar();
VS
2
function bar() {
alert("baz");
}
bar();
当然,第二个例子的代码可能略少,但是当你开始获得很多功能时 - 它会变得混乱。
我发现它的方式,方式,更清晰,例如,使用Game.update()
而不是使用updateGame();或类似的。当更深入时,如Game.notify.admin(id)
等,它会为您提供更漂亮的代码。
通过在对象中存储函数有什么缺点吗?
答案 0 :(得分:67)
首选方法。这样,您可以明确定义函数的范围,而不是污染全局范围。使用第一种方法没有缺点。只有好处: - )
结论:始终使用第一种方法来定义函数。第二个就像90年代的javascript一样,让我们过去安息吧,并使用适当的范围。
答案 1 :(得分:4)
命名空间对象没有神奇之处,如果使用大量全局变量,也不会有任何问题。 使用“命名空间”对象的主要原因是减少重复全局变量名称的可能性。第二个原因是为方便起见将类似的功能组合在一起,例如:
// 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;
当然,前者通常是首选,因为它看起来更容易使用。我并不主张你采用第二种方法(我使用第一种方法),只是指出虽然存在创建大量全局变量的问题,但所谓的“全局命名空间污染”被大大高估为危险。 / p>
答案 2 :(得分:3)
在这个特定情况下,请使用第一个。但是如果你的Foo对象变得非常复杂,你可能想要使用另一种方法来让你有机会使用构造函数。而且当涉及到函数的范围时,第一种方法有时并不是最好的方法:
function Foo(appName){
this.name = appName;
}
Foo.prototype.Bar = function(){
alert(this.name)
}
var a = new Foo("baz");
a.Bar();