【问题标题】:javascript function scope, variable declarationjavascript函数范围,变量声明
【发布时间】:2011-03-04 13:31:38
【问题描述】:

假设我有以下情况:

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

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


[编辑]

感谢大家的回答!

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

【问题讨论】:

  • 没有你关心的性能差异。

标签: javascript performance variables scope declaration


【解决方案1】:

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

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

Benchmark!.

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

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

但这是一个纳米优化,如果您关心这种口径的性能差异,请改写程序集。寻找可读可维护代码。

[编辑]

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

【讨论】:

  • 我不反对,但请注意,在“test2”中,标识符被列为(可能未使用的)函数参数。
  • @Pointy 如前所述,我没有注意到。这是一个糟糕的可读性点。
  • @Martijn 这令人印象深刻。一定是 FF4beta 解释器中的一个 bug,导致函数参数的存储非常昂贵。
  • 是的,很奇怪。我已经将它提交给 Mozilla,我希望那里的人能对此有所了解。
【解决方案2】:
  1. 为什么不分析您的代码?
  2. 变量也是test1 中的局部变量。您使用var i 声明它们。 这些方法之间没有区别。

【讨论】:

    【解决方案3】:

    “test1”中的变量都是用var 声明的,所以它们不是全局的。这两个应该本质上是一样的。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 不使用全局范围...仔细看!
      • 他们也是test2的本地人。
      • 我没有说他使用的是全局作用域。仔细地看! :) 我在解释为​​什么本地范围比全局范围快。在那个层次结构中,参数也比本地人“更远”。
      • 我认为参数的存储方式与本地人完全相同。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-08-22
        • 2010-11-23
        • 2022-11-30
        • 2020-07-31
        • 1970-01-01
        • 2013-11-19
        • 1970-01-01
        相关资源
        最近更新 更多