JavaScript for-loop alternative: repeat(n, function(i) { … });

前端 未结 5 887
臣服心动
臣服心动 2021-02-09 22:05

This is the regular for-loop:

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

It is used to iterate over arrays, but also to just repeat some process

5条回答
  •  生来不讨喜
    2021-02-09 22:36

    To address the issue of not having the break statement as others have mentioned, I would solve it this way:

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

    Then returning false from within a loop handler will be equivalent to break.

    Another disadvantage is that the context changes. You may want to add the option of proxying a context into the loop handlers:

    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;
        }
    }
    

    Now, an advantage is that the index is preserved by the function scope, to avoid a common bug:

    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);
    });
    

提交回复
热议问题