JavaScript 中 eval 的替代方案是什么?

2024-01-05

我有一些代码,看起来像这样:

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 是邪恶的 https://stackoverflow.com/questions/86513/why-is-using-javascript-eval-function-a-bad-idea(如坏)和慢(如我发现的),但我真的不能做任何其他事情 - 服务器只是将数据从数据库中取出并推送到浏览器。

我还有哪些选择?我可以做与我在服务器上所做的相同的事情,但这只会将负担转移到更高的链条上。我无法更改数据库布局,因为所有内容都与这 8 个变量挂钩,并且是一项艰巨的任务。


function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8]; // put values in an array
    this.i = [];
    for (var i=0,j=0 ;i<8;i++) { // now i goes from 0-7 also
        var k = args[i]; // get values out
        if (k > 0) {
            this.i[j++] = k;
        }
    }
}

上面的代码可以进一步简化,我只是做了最小的改变来摆脱eval。你可以摆脱j, 例如:

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    var args = [i1, i2, i3, i4, i5, i6, i7, i8];
    this.i = [];
    for (var i = 0; i < args.length; i++) {
        var k = args[i];
        if (k > 0) { this.i.push(k); }
    }
}

是等价的。或者,使用内置的arguments对象(以避免参数列表出现在两个地方):

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) {
    this.i = [];
    for (var i = 1; i < arguments.length; i++) {
        var k = arguments[i];
        if (k > 0) { this.i.push(k); }
    }
}

即使您没有过滤列表,您也不想做类似的事情this.i = arguments因为arguments不是真正的数组;它有一个callee您不需要的属性,并且缺少您可能需要的一些数组方法i。正如其他人指出的那样,如果您想快速转换arguments对象到数组中,您可以使用以下表达式来执行此操作:

Array.prototype.slice.call(arguments)

你可以用它来代替var args = [i1, i2 ...上面的行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中 eval 的替代方案是什么? 的相关文章

随机推荐