我一直在研究JavaScript性能.我已经了解到,在不止一次访问时,通常最好将闭包变量和类成员复制到本地范围以加快速度.例如:
var i = 100;
var doSomething = function () {
var localI = i;
// do something with localI a bunch of times
var obj = {
a: 100
};
var objA = obj.a;
// do something with objA a bunch of times
};
Run Code Online (Sandbox Code Playgroud)
我理解这一点; 它为解释器添加了一个快捷方式,用于按名称查找值.在处理方法时,这个概念变得非常不清楚.起初,我认为它会以同样的方式工作.例如:
var obj = {
fn: function () {
// Do something
return this.value;
},
value: 100
};
var objFn = obj.fn
objFn();
// call objFn a bunch of times
Run Code Online (Sandbox Code Playgroud)
事实上,这根本不起作用.访问这样的方法会将其从其范围中删除.当它到达this.value行时,这指的是window对象,this.value可能是未定义的.我可以使用objFn.call(obj)将其范围传回到它中,而不是直接调用objFn和丢失范围,但这是否比原始的obj.fn()更好或更差?
我决定写一个脚本来测试这个,我得到了非常令人困惑的结果.该脚本对多个测试进行迭代,这些测试循环执行上述函数调用多次.每次测试所花费的平均时间输出到身体.
使用许多简单方法创建对象.额外的方法用于确定解释器是否必须更加努力地找到特定方法.
测试1简单地调用this.a(); …