JavaScript for-loop替代方法:repeat(n,function(i){...});

时间:2011-02-08 02:45:38

标签: javascript jquery loops

这是常规for循环:

for (var i = 0; i < n; i++) { ... }

它用于迭代数组,但也只是重复一些进程n次。

我使用上面提到的形式,但它击退了我。标题var i = 0; i < n; i++很简单,每次使用时都必须按字面重写。

我正在写这个问题,因为我想出了一个替代方案:

repeat(n, function(i) { ... });

这里我们使用带有两个参数的repeat函数:
1.迭代次数,
2.一个身体代表正在重复的过程的功能。

“代码隐藏”就是这样:

function repeat(n, f) {
    for (var i = 0; i < n; i++) {
        f(i);
    }
} 

(我知道在流程范围链中增加两个“级别”的性能影响)

BTW,对于那些使用jQuery库的人来说,上面提到的功能可以通过$.each方法开箱即用,如下所示:

$.each(Array(n), function(i) { ... });  

那你觉得怎么样?这个repeat函数是否是native for循环的有效替代?这个替代方案的缺点是什么(性能除外 - 我知道这个)?

本机:

for (var i = 0; i < 10; i++) {
    // do stuff
}

替代方案:

repeat(10, function(i) {
    // do stuff
});

5 个答案:

答案 0 :(得分:10)

你说你想要一场革命......嗯,你知道吗:ruby就在之前做过(?)

Number.prototype.times = function(func) { 
    for(var i = 0; i < Number(this); i++) {
        func(i); 
    }
}

装置

(50).times(function(i) {
    console.log(i)
})

无论如何,不​​要与C作斗争,你总会失败:-P

答案 1 :(得分:5)

这是一个有趣的想法,但如果你不喜欢循环的语法,你总是可以做一个不同类型的循环:

var i = arr.length; 
while (i--) {
    // do stuff
}

反向while循环通常也比for循环快。

答案 2 :(得分:2)

为了解决没有其他人提到过的破解声明的问题,我会这样解决:

function repeat(n, f) {
    for (var i = 0; i < n; i++) {
        if (f(i) === false) return;
    }
}

然后从循环处理程序中返回false将等同于break

另一个缺点是上下文发生了变化。您可能希望将上下文代理选项添加到循环处理程序中:

function repeat(context, n, f) {
    if (!f) f = n, f = context, context = window;

    for (var i = 0; i < n; i++) {
        if (f.call(context, i) === false) return;
    }
}

现在,优势是索引由函数范围保留,以避免常见错误:

for (var i = 0; i < 10; i++) {
    setTimeout(function () {
        alert(i); // Will alert "10" every time
    }, 1000);
}

repeat(10, function (i) {
    setTimeout(function() {
        alert(i); // Will alert "0", "1", "2", ...
    }, 1000);
});

答案 3 :(得分:1)

看起来很有效。老实说,我认为性能不会下降太多。但是有一个很大的缺点,很容易解决:中断声明。

function repeat(n, f) {
   for (var i = 0; i < n; i++) {
      var tcall=i;
      tcall.die=function(){i=n}
      f.call(tcall);
   }
}  

通过这种方式,您可以拨打this.die()而不是break;,我认为这会引发错误。

答案 4 :(得分:1)

除了你已经说过的,我看到的主要缺点是“返回”声明将以不同的方式工作。 (这也是为什么我最终在自己的企业中多次使用“for”而不是“$ .each”。)