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

时间:2012-01-17 22:37:20

标签: javascript function object

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

考虑:

1

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

Foo.bar();

VS

2

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

bar();

当然,第二个例子的代码可能略少,但是当你开始获得很多功能时 - 它会变得混乱。 我发现它的方式,方式,更清晰,例如,使用Game.update()而不是使用updateGame();或类似的。当更深入时,如Game.notify.admin(id)等,它会为您提供更漂亮的代码。

通过在对象中存储函数有什么缺点吗?

3 个答案:

答案 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();