javascript函数范围,变量声明

时间:2011-03-04 13:31:39

标签: javascript performance variables scope declaration

假设我有以下情况:

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可能更有效,因为变量在本地函数范围内,因此在函数退出后,执行上下文被破坏,释放用于参数的资源......变量将不被分配到全局对象'窗口'。

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


[编辑]

谢谢大家的回答!

如果代码存在可读性问题,则没有问题......我现在只对性能/内存使用情况感兴趣。

5 个答案:

答案 0 :(得分:1)

如果您没有使用var i声明变量,那么它们将成为隐式全局变量。

始终声明您的变量。如果您对此进行了任何基准测试,您会发现声明的局部变量实际上比隐含的全局变量更快。你也不会以这种方式泄漏到全球状态。

Benchmark!

正如您所看到的,表现相同。

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

但这是纳米优化如果你关心这个口径的性能差异,请写程序集。转到可读 maintanable 代码。

<强> [编辑]

没有注意到方法参数中的“本地”变量。那是一个可读性杀手!不要那样做。你会发现test1可能更有效率。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

“test1”中的变量都是用var声明的,所以它们全局。这两者应该基本相同。

答案 3 :(得分:0)

test1更快,因为每当JavaScript查找符号(例如变量名称)时,它都会通过查看本地范围来开始。因此,通过使用全局范围,它必须在更多位置查找符号。这同样适用于参数,但它们比全局变量更好。

答案 4 :(得分:0)

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