这很有趣,但我在这里的小测试似乎证实了我之前的假设,即jsPerf环境会影响作用域和作用域链查找本身。我没有深入研究“如何”和“为什么”,但这是我的小测试脚本:
var n1 = 12;
var add1 = function(n2){
return n1 + n2;
}
var add2 = (function(){
return function(n2){
return n1 + n2;
}
})();
var add3 = (function(){
var cn1 = n1;
return function(n2){
return cn1 + n2;
}
})();
var add4 = function( n2, n1 ) {
return n2 + n1;
}.bind(null, n1);
var tests = [add1, add2, add3, add4],
start, stop, loops;
tests.forEach(function( fnc ) {
loops = 100000;
start = Date.now();
while( loops-- ) {
fnc( 2 );
}
stop = Date.now();
console.info('Method ', fnc.name || fnc.toString(), ': ', stop - start, ' ms.');
});
我的 FireFox 14 上的结果如下所示:
方法add1:570ms。
方法add2:566ms。
方法add3:414ms。
方法add4:479ms。
最新的 Chrome 结果:
方法add1:199ms。
方法add2:136ms。
方法add3:85ms。
方法add4:144ms。
这肯定看起来更合理。封闭的作用域链查找必须总是更快,这仅仅是因为存在较短的查找链。即使所有现代浏览器通常不进行经典的范围链查找,我也知道这一点。无论如何,由于浏览器为自由(或超出范围)变量创建了非常聪明的查找表,所有结果至少应该是相同的。过度优化全局对象访问 IMO 没有任何意义。
正如您所注意到的,我为绑定方法创建了一个额外的测试用例。