这是常规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
});
答案 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”。)