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

Zar*_*Zar 71 javascript function object

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

考虑:

1.

Foo = {
    bar: function() {
        alert("baz");
    }   
}
Run Code Online (Sandbox Code Playgroud)

Foo.bar();

2.

function bar() {
    alert("baz");
}
Run Code Online (Sandbox Code Playgroud)

bar();

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

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

Dar*_*rov 72

第一种方法是首选.这样,您可以明确定义函数的范围,而不是污染全局范围.使用第一种方法没有缺点.只有好处:-)

结论:始终使用第一种方法来定义函数.第二个就像是90年代的javascript,让我们过去安息吧,并使用适当的范围.

  • 积极地嵌套存在一些缺点.将_functions_放在对象上"因为它更好",例如是愚蠢的.(将函数放在全局范围内也很愚蠢,但这不是处理的,假设模块范围).将对象和函数嵌套到4层以上也是愚蠢的.理想情况下,您需要一个或两个层作为对象/方法链`foo.bar.baz()` (3认同)
  • 它真的是关于范围吗?或者只是减少全局变量的数量以减少重复变量名称的机会."全球污染"是否有**其他不良副作用? (2认同)
  • @ PhilOlson-简单地在对象中存储值与使用变量没有任何好处.如果需要模块化(并且模块化是一个好主意),则存在模块模式,其仅公开需要公开的那些属性并将其余属性隐藏在单独的执行上下文中. (2认同)

Rob*_*obG 5

命名空间对象没有什么魔力,如果使用大量全局变量,也不一定会遇到任何问题。\n使用“命名空间”对象的主要原因是减少重复全局变量名称的可能性。第二个原因是为了方便起见将类似的功能组合在一起,例如:

\n\n
// Object example (suggested best practice):\n// DOM functions are under myLib.dom\nmyLib.dom.someDOMFunction0;\nmyLib.dom.someDOMFunction1;\n\n// Utility functions are under myLib.util\nmyLib.util.someUtilityFunction0;\nmyLib.util.someUtilityFunction1;\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,上面的内容实际上与类似的全局变量有相同的重复机会:

\n\n
// Global variable example:\nmyLib_dom_someDOMFunction0;\nmyLib_dom_someDOMFunction1;\n\nmyLib_util_someUtilityFunction0;\nmyLib_util_someUtilityFunction1;\n
Run Code Online (Sandbox Code Playgroud)\n\n

当然,通常首选前者,因为它更容易使用。我并不是提倡你采用第二种方法(我使用第一种),只是指出虽然创建大量全局变量存在问题,所以\xe2\x80\x93所谓的“全局命名空间污染”被大大高估了作为一个危险。

\n