2011-03-04 153 views
1

让说,我有以下情形:现在javascript函数范围,变量声明

var namespace = {}; 
(function($) 
{ 
    $.extend(namespace, 
    { 
     test1: function(someArray, someObj) 
     { 
      for(var i= 0, ii= someArray.length;i<ii;i++) 
      { 
       var text = someObj[someArray[i]]; 
       // do something with text 
      } 
     }, 
     test2: function(someArray, someObj,i,ii,text) 
     /* 
      see that the i,ii,text are unused parameters, 
      that will be used instead of variables 
     */ 
     { 
      for(i= 0, ii= someArray.length;i<ii;i++) 
      { 
        text = someObj[someArray[i]]; 
       // do something with text 
      } 
     }, 
    }); 
})(jQuery); 

中,TEST1和TEST2的结果都是一样的......但什么性能,内存使用情况.. 在上面介绍的两种方法中,声明i,ii,测试变量有什么区别吗?

例如,我认为test2可能更高效,因为变量位于本地函数作用域中,所以在函数退出后,执行上下文将被销毁,释放用于参数的资源......变量将不会被分配给全局对象'窗口'。

那么什么方法表现最好?为什么?


[编辑]

感谢所有为你解答!

如果代码具有可读性问题,则没有问题...我现在只关注性能/内存使用情况。

+0

没有你关心的性能差异。 – Raynos 2011-03-04 13:47:08

回答

1

如果你没有用var i声明你的变量,那么它们就变成了隐含的全局变量。

总是声明你的变量。如果你做了任何基准测试,你会发现声明的局部变量实际上更快而隐含的全局变量。你也不会以这种方式泄漏到全局状态。

Benchmark!

正如您所见,性能是相同的。

就内存使用而言,局部变量(test1)可能更好,因为编译器不必记住该函数有5个参数。

但是,这是一个纳米优化如果你关心这个口径的性能差异写装配代替。去可读支持代码。

[编辑]

没有注意到方法参数 “局部” 变量。这是一个可读性杀手!不要这样做。你会发现test1可能仍然更有效率。

+0

我并不反对,但请注意,在“test2”中,标识符被列为功能的参数(推测未使用)。 – Pointy 2011-03-04 13:35:48

+0

@Pointy如上所述,我没有注意到。这是一个可怕的可读性点。 – Raynos 2011-03-04 13:38:03

+0

此外,我不知道为什么,但test2在Firefox 4 beta 12上表现糟糕...... – Martijn 2011-03-04 13:53:09

0

“test1”中的变量全部用var声明,因此它们全局为而不是。这两个应该基本相同。

1
  1. 为什么不分析你的代码?
  2. 变量也是本地的test1。你用var i来声明它们。 这些方法没有区别。
0

test1更快,因为每次JavaScript查找符号(如变量名称)时,都会从查找本地范围开始。因此,通过使用全局范围,它必须查找更多地方才能找到符号。这同样适用于参数,但它们比全局变量更好。

+0

不使用全球范围...仔细看! – awm 2011-03-04 13:37:40

+0

它们在'test2'中也是本地的。 – 2011-03-04 13:37:41

+0

我没有说他正在使用全球范围。仔细地看! :)我解释了为什么本地范围比全球更快。在这个等级中,参数比当地人“更远”。 – Simeon 2011-03-04 13:43:39

0

它可能很小,但是在每次迭代中声明一个新的变量(文本)需要新的内存分配,我相信。虽然我不确定JavaScript是如何处理的。我通常会事先声明变量,然后为此分配值,但那只是因为有人说“嘿,你应该这样做”,并提出了相同的论点。