为什么那些Javascript代码段执行相同的操作?

Mai*_*tor -1 javascript performance benchmarking

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);    
};
Run Code Online (Sandbox Code Playgroud)

这里,test1和test2都执行相同的操作,即使test2每次被调用时都会创建一个新函数.为什么?

Ted*_*opp 6

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

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