在对象中封装Javascript代码会影响性能吗?

在对象中封装Javascript代码会影响性能吗?,javascript,encapsulation,Javascript,Encapsulation,我想知道将JavaScript代码的主体封装在对象中是否更有效?这样,程序的整个作用域将与其他作用域(如window)分离 例如,如果我在JavaScript文件中有以下代码: /* My main code body. */ var somevar1=undefined; var somevar2=undefined; var somevarN=undefined; function somefunction(){}; function initialize(){/* Initialize

我想知道将JavaScript代码的主体封装在对象中是否更有效?这样,程序的整个作用域将与其他作用域(如window)分离

例如,如果我在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搜索一个作用域中的所有变量,直到找到正确的变量为止,因此将特定于应用程序的函数和变量保留在它们自己的作用域中会提高效率,特别是如果有很多函数和变量的话


我唯一担心的是,这是一种糟糕的做法,或者这可能会增加新“应用程序”范围内变量和函数的查找时间。如果这是不好的做法或完全无用,请让我知道!谢谢大家!

我不知道性能影响是什么(我怀疑这两种情况都可以忽略不计,但如果你真的担心的话,请测试一下),但是JavaScript中非常常见的做法是将代码块保留在自己的范围内,而不是将所有内容都放在全局范围内

主要好处是减少意外覆盖全局范围内变量的风险,并使命名更容易(即,您有
window.application.initialize
,而不是
window.initialize\u application

您可以使用自调用函数为一位代码创建一个作用域,而不是上面的实现。这被称为

这样做的另一个好处是,您可以创建“私有”变量,这些变量只能在模块内访问,因此无法从运行在同一全局对象中的其他代码中访问:

/* 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

我知道你问了一个是或不是的问题。不过,我的回答是,别担心,为了支持这一点,我想引用Marijn Haverbeke的一段话

速度与优雅的矛盾是一个有趣的问题。你可以 把它看作是人类友好与和谐的连续体 机器友好性。几乎任何程序都可以通过 它更大,更复杂。程序员必须决定一个 适当的平衡。。。。 这条基本规则已经被许多程序员重复,并且 我完全同意这一点,那就是在 你肯定知道这个程序太慢了。如果是,请查明 哪些部件占用的时间最多,并开始交换优雅 为了提高这些部分的效率


拥有易于阅读的代码是我在这里遇到的问题的关键,因此我将坚持使用模块化方法,即使变量和函数的查找链稍长。这两种方法似乎各有利弊

一方面,您有一个全局范围,它从一开始就包含多个变量。如果将所有代码放在全局范围内,则该范围内的变量列表将包括您自己的变量以及innerWidth和innerHeight等变量。引用变量时要搜索的列表会更长,但我相信这是一个非常小的开销,值得担心

另一方面,您可以只将一个对象添加到全局范围中,该全局范围包含您想要使用的所有变量。在这个范围内,您可以很容易地引用这些变量,并避免搜索全局变量,如innerWidth和innerHeight。缺点是,当从全局范围访问封装的变量时,您会有一个较长的查找链,例如:globalscope.customscope.myvar,而不是globalscope.myvar或仅myvar


从这个角度看,这似乎是一个非常琐碎的问题。也许最好的方法就是封装那些为了分离代码而结合在一起的东西,并将注意力集中在可读性上,而不是有一堆效率稍高的不可读代码。

不,这也会像闪电一样快,只需编写可读的功能代码。当性能成为问题时,性能是一个问题。我很确定每个标识符都有自己的地址,因此我认为除非脚本文件由子字符串循环,否则您的想法不会有多大作用。即使这样做确实会提高性能,以这种方式编写代码将使您的程序更难读取和修改,这将影响您的性能(或其他正在阅读的人)管理它时的性能。正如Paul D.Waite提到的,我并不知道性能影响,尽管它可以忽略不计,但这是一个很好的实践……它是最流行的JavaScript模式之一的开始。我读过关于模块模式的书,我非常喜欢它!只要它不是一个性能太高的模式ce bane,从现在起,我将使用封装方法,只是为了保持函数和变量名的统一,而不是过于特定于它们所属的对象。@CupawnTae:你显然从未见过性能影响驱动力!我不时在它们自己的对象中分割代码块,以保持简单,这是OOP的美妙之处,但我真正的问题是,将您为程序编写的所有内容封装在一个大的“应用程序”对象中以使其与全局范围分开是否有益?@Frank:啊-最初,关于性能影响,我的回答是“我怀疑他们两种方式都有疏忽”.CupawnTae评论说我的意思可能是“可忽略不计”,我笑着回答说“你显然从来没有见过性能影响驱动!”@Frank:“我真正的问题是,将你为程序编写的所有内容封装在一个大的“应用程序”中是否有益反对将其与全球范围分开?”-如果这是您真正的问题,那么您可以编辑上面的原始问题以使其更清楚。Technica