2

我目前将所有脚本所需的元素缓存在类似于以下的全局对象中:

var MainObject={
   $El1 : $('#element1'), 
   $El2 : $('#element2')
   };

在我的方法中,我可以直接访问该对象。

method1:function(){
   MainObject.$El1 // DO SOMETHING WITH THIS ELEMENT
}, ...

所以,我有2个问题。

我读过局部变量是最快的。像这样写我的方法会更好吗?

method1:function(){
    var $El1=MainObject.$El1; 
    $El1 // DO SOMETHING WITH THIS ELEMENT
}, ...

如果是这样...

如果我的脚本中有许多引用这些元素的方法(它们很快就会变成很多行),那么压缩它们的最佳方法是什么?

method1:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

method2:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

method3:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

谢谢!

4

3 回答 3

3

在您测量到您在需要解决的特定方法中确实存在性能问题之前添加过早优化的代码很少,如果有的话,是一个好主意。它只是增加了更多的代码行,需要更长的时间来编写并且通常不能解决任何实际问题。

然后,当您确实有性能问题需要解决时,您需要仔细衡量以找出该方法的哪些方面真正需要时间。


是的,局部变量比全局变量更快(在全局范围之前搜索局部范围以解析变量名)。是的,多个引用MainObject.$EL1比单个本地引用慢。


这是我的一般经验法则。如果您只是MainObject.$EL1在一个方法中使用一次或两次之类的东西,那么将其缓存在局部变量中几乎没有什么好处。如果您使用它三次或更多次,那么将其缓存在本地以防止所有额外的查找是很有意义的。我通常会在 javascript 和 C++ 中做同样的事情。

如果你有一个实际的性能问题,并且你想更快地做出一些事情,那么你对性能问题主要原因的第一直觉很少是正确的。因此,分析并找出真正花费最多时间的内容是很有意义的。然后,当您进行更改时,您需要一种方法来衡量更改的影响,以了解您在添加更多代码时实际上正在发挥作用。

于 2013-02-24T00:35:22.727 回答
1

这个getElements()功能是不可能的

局部变量以范围结束..一旦范围结束,变量也消失了..

你应该阅读这些优秀的文章JavaScript 变量作用域变量作用域

于 2013-02-24T00:19:24.850 回答
0

局部变量更快,但不是很多。您需要在函数内多次访问变量,以弥补首先将值复制到局部变量所需的时间。如果你只使用一次,你只会浪费那段时间。

这是一个性能测试:http: //jsperf.com/variables-vs-properties-2

您不仅可以看到在对象中查找属性和使用局部变量之间没有太大区别,您还可以看到您必须这样做数百万次才能发现差异。

于 2013-02-24T00:53:27.377 回答