用Javascript中的eval替换重复出现的循环 - 好还是坏?

时间:2010-03-14 16:27:16

标签: javascript eval

我的代码中的各种函数中出现了多次循环。 举一个例子说明,它几乎与以下几行有关:

for (var i=0;i<= 5; i++) {
    function1(function2(arr[i],i),$('div'+i));
    $('span'+i).value = function3(arr[i]);
}

我当然是循环计数器。为了减少我的代码大小并避免重复循环声明,我想我应该用以下内容替换它:

function loop(s) {
 for (var i=0;i<= 5; i++) { eval(s); }
}

[...]

loop("function1(function2(arr[i],i),$('div'+i));$('span'+i).value = function3(arr[i]);");

或者我应该吗?我已经听说过很多关于eval()减慢代码执行速度的事情,我希望即使在Nintendo DSi浏览器中它也能正常工作,但我也希望减少代码。你会建议什么?

提前谢谢!

5 个答案:

答案 0 :(得分:5)

为什么不将循环体放入函数中?

function doSomething(i, arr) {
    function1(function2(arr[i],i), $('div'+i));
    $('span'+i).value = function3(arr[i]);
}

并在循环中调用它:

function loop() {
    for (var i = 0; i <= 5; i++) { doSomething(i, arr); }
}

答案 1 :(得分:1)

这是一个可怕的想法。

  • 效率低下
  • 调试起来比较困难

如果您担心带宽,请使用minification和HTTP压缩。

答案 2 :(得分:1)

尔加!

这是一个很好的问题,但不,不要那样做。一般不建议使用eval,因为你不会在加载时看到解析错误,只在运行时(更难调试),更难理解范围是什么时候(更难写),而你丢失所有工具链支持(语法高亮,脚本调试)。

幸运的是,由于Javascript基本上是一种函数式语言,为什么不创建一个封装你想做的事情的函数,然后调用它呢?

function doMyThingNTimes(n, arr) {
    for (var i=0;i <= n; i++) {
        function1(function2(arr[i],i),$('div'+i));
        $('span'+i).value = function3(arr[i]);
    }
}

答案 3 :(得分:0)

呃,不。 eval应该被视为接近最后的手段。 JavaScript函数是First Class Objects所以我只是声明你需要的任何函数并将它们作为一个参数传递。

答案 4 :(得分:0)

为什么不:

function loop(s) {
  for (var i=0;i<= 5; i++) { s(i); }
}

loop(function4() {
    function1(function2(arr[i],i),$('div'+i));$('span'+i).value = function3(arr[i]);
});