-1
obj = [1,2,3,4,5];
function iter(){
    for (var key in obj){
        key=key+key;
    };
};
function test1() { 
    iter(obj); 
};
function test2(){
    (function iter(obj){
        for (var key in obj){
            key=key+key;
        };
    })(obj);    
};

在这里,test1 和 test2 执行相同的操作,即使 test2 应该在每次调用它时创建一个新函数。为什么?

4

3 回答 3

6

我的猜测是性能没有差异,因为代码没有(有意义的)差异。解析器在解析代码时会在内部创建一次本地iter函数test2,而不是每次test2都调用它。(这不像使用eval.)如果有的话,第二个会快一点,因为obj它是函数的本地iter嗯,那是错误的。

正如这个 jsperf 测试所示,第二个确实更慢。你必须小心测量。您编写函数的方式,函数体中完成的工作量很容易掩盖两种情况下函数调用开销的差异。此外,第一种情况是访问全局obj,而第二种情况是访问参数。应消除这些差异,以尽可能仅测量您要测量的内容。我编写的 jsperf 测试试图做到这一点。

于 2013-01-18T20:36:42.597 回答
1

你是对的,他们或多或少的表现相同

您的第二个函数中包含一个闭包,每次调用它时都会产生创建匿名函数的开销。

在第一个中,js可以调用它已经存储的函数。

这导致第二个函数有点慢。

于 2013-01-18T20:41:01.707 回答
1

我几乎可以保证您不会在 5 个周期内看到性能差异。在现代 JS 引擎中,您将需要通过数千甚至数万范围内的迭代来测试这一点,才能真正看到差异。然而,这种差异最终肯定会显现出来。

于 2013-01-18T20:37:14.183 回答