我想知道将JavaScript代码的主体封装在对象中是否效率更高或更低?这样,程序的整个范围将与窗口等其他范围分开。
例如,如果我在JavaScript文件中有以下代码:
/* My main code body. */
var somevar1=undefined;
var somevar2=undefined;
var somevarN=undefined;
function somefunction(){};
function initialize(){/* Initializes the program. */};
/* End main code body. */
我可以将主代码体封装在一个对象中:
/* Encapsulating object. */
var application={};
application.somevar1=undefined;
application.somevar2=undefined;
application.somevarN=undefined;
application.somefunction=function(){};
application.initialize=function(){/* Initializes the program. */};
我的逻辑是,由于JavaScript搜索范围内的所有变量直到找到正确的变量,因此将应用程序特定的函数和变量保留在自己的范围内会提高效率,尤其是在存在大量函数和变量的情况下。 p>
我唯一担心的是这是不好的做法,或者这可能会增加新“应用程序”范围内变量和函数的查找时间。如果这是不好的做法或完全没用,请告诉我!谢谢!
答案 0 :(得分:3)
我不知道性能影响是什么(我怀疑它们无论如何都可以忽略不计,但是如果你真的担心,那就测试一下),但是在JavaScript中保存代码块是很常见的做法。范围,而不是让一切都在全球范围内。
主要好处是可以降低在全球范围内意外覆盖变量的风险,并使命名更容易(即您拥有window.application.initialize
而不是window.initialize_application
。)
您可以使用自调用函数为一位代码创建范围区域,而不是上面的实现。这称为the module pattern。
这样做的另一个好处是允许您创建只能在模块中访问的“私有”变量,因此无法从同一全局对象中运行的其他代码访问这些变量:
/* Encapsulating object. */
var application=( function () {
var someprivatevar = null// This can't be accessed by code running outside of this function
, someprivatefunction = function () { someprivatevar = someprivatevar || new Date(); };
return {
somevar1: undefined
, somevar2: undefined
, somevarN: undefined
, somefunction: function(){}
, getInitialized: function () { return someprivatevar; }
, initialize: function (){/* Initializes the program. */ someprivatefunction(); }
};
})();
application.initialize();
application.getInitialized();// Will always tell you when application was initialized
答案 1 :(得分:2)
我意识到你问的是或否是问题。但是,我的回答是不要担心,为了支持这一点,我想发布一条来自Eloquent Javascript的引文,由Marijn Haverbeke撰写。
速度与优雅的困境是一个有趣的问题。您可以 把它看作是人与人之间的一种连续统一体 机器友好。通过制作几乎可以使任何程序更快 它更大,更复杂。程序员必须决定 适当的平衡.... 基本规则,已经被许多程序员重复并且具有 我完全同意的是,直到不担心效率 你知道程序太慢了。如果是,请找出答案 哪些部分占用了最多的时间,并开始交换优雅 提高这些部分的效率。
答案 2 :(得分:0)
易于阅读的代码是我的问题的关键,因此即使变量和函数的查找链稍长,我也会坚持使用模块化方法。这两种方法似乎都有利有弊。
一方面,您拥有从一开始就拥有多个变量的全局范围。如果将所有代码放在全局范围内,那么该范围内的变量列表将包含您自己的变量以及innerWidth和innerHeight等变量。在引用变量时搜索的列表会更长,但我相信这是一个很小的开销,令人担心是荒谬的。
另一方面,您只能将一个对象添加到全局范围,该范围包含您要使用的所有变量。在此范围内,您可以轻松引用这些变量,并避免搜索全局变量,如innerWidth和innerHeight。问题是,当从全局范围访问封装变量时,您将拥有更长的查找链,例如:globalscope.customscope.myvar而不是globalscope.myvar或myvar。
当我这样看时,这似乎是一个非常微不足道的问题。也许最好的解决方法就是只是为了整理代码而将各种东西封装在一起,并将注意力集中在可读性上,而不是让一堆不可读的代码更加高效。