我最近加入了一个webapp项目,作为一个标准,它维护一个全局可用的(即,本身是window
)属性的对象,它包含作为属性或递归子属性的所有对象运行应用程序所需的函数和变量 - 包括所有小部件的状态指示符,初始化别名,通用DOM操作方法 - 所有内容。我会试着用简化的伪代码来说明,但是这让我担心,这就是这个东西是独立的。基本上没有任何东西被封装:可以从任何地方读取或修改所有单个粒度组件。
在我最近的工作中,我一直是高级或唯一的Javascript开发人员,所以我已经能够使用函数编写,通常立即调用/自动执行,用于确定谨慎的代码块并保持粒度基元为这些范围内的变量。使用这种模式,默认情况下一切都被锁定到其执行范围,偶尔会在需要暴露API的情况下返回一些明智选择的getter / setter函数。
将代码重构为从样式A到样式B的功能奇偶校验是一项庞大的任务,因此我无法对我的断言进行任何有意义的实际测试,而是单片神对象反模式一个已知的性能怪物与范围功能风格?我会为了易读性,代码安全性和关注点分离而争论B ......但是我想象一直将所有内容保存在内存中,通过查找链等进行爬行会使其成为访问任何内容的固有性能密集型练习,或至少使垃圾收集成为一项非常困难的任务。
答案 0 :(得分:2)
有几件事需要考虑,更多内存密集型程序不一定要慢一些。
此外,即使您使用自执行函数,并且只显示一些函数,该函数的其余部分仍保留在内存中,因为暴露的函数可能需要它。内存泄漏是因为关闭,现在网络上的大话题。
现在,假设v8的工作方式,javascript代码被编译为C ++然后汇编。现在,大量使用的函数变成热代码,并且反复使用函数的相同缓存版本。对象也是如此。
但是如果您以后编辑过某个对象,则会重新编译该对象,并且会影响性能。
如果使用Try .. Catch块,则无法有效编译它们。但是,如果将Try ... Catch块中的代码包装到函数中,那确实有帮助。
对于提高性能最重要的任务,最重要的是将大部分静态函数写成函数。并且不要多次更改已定义的对象。
将代码包装在自执行函数中可能无济于事,因为它仍保留在内存中。但是附加函数定义可能会以不同方式编译。尽管如此,因为它只是一个包装函数,所以应该几乎没有任何区别。