我有一些看起来像这样的代码:
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
this.i = [];
for (var i=1,j=0 ;i<9;i++) {
var k = eval("i"+i);
if (k > 0) {
this.i[j++] = k;
}
}
}
FireBug 分析器声称第二长的函数是 eval(),占用了将近 6% 的运行时间。
每个人都说 eval 是 EVIL (坏)和慢(正如我所发现的),但我真的无能为力 - 服务器只是将数据从数据库中拉出并推送到浏览器。
我有什么选择? 我可以在服务器上做同样的事情,但这只会将负担转移到更高的链条上。我无法更改数据库布局,因为所有内容都与这 8 个变量挂钩并且是一项艰巨的任务。
原文由 graham.reeds 发布,翻译遵循 CC BY-SA 4.0 许可协议
上面的代码可以进一步简化,我只是做了最小的改动来去掉
eval
。您可以摆脱j
,例如:是等价的。或者,使用内置的
arguments
对象(避免在两个地方有你的参数列表):即使你没有过滤列表,你也不想做类似
this.i = arguments
的事情,因为arguments
不是真正的数组;它有一个您不需要的callee
属性,并且缺少一些您可能需要的数组方法i
。正如其他人指出的那样,如果您想快速将arguments
对象转换为数组,可以使用以下表达式:您可以使用它来代替上面的
var args = [i1, i2 ...
行。