迭代器模式

来源:互联网 发布:收看地方电视台的软件 编辑:程序博客网 时间:2024/06/06 01:49

javascript实现迭代器

    var each = function (ary,callback) {        for(var i=0,l=ary.length;i<l;i++){            callback.call(ary[i],i,ary[i])        }    }    each([1,2,3],function (i,n) {        alert([i,n])    })

外部迭代器

可以手动控制迭代的过程,比较两个数组是否相等
    var Iterator = function (obj) {        var current = 0;        var next = function () {            current+=1;        }        var isDone =function () {            return current >= obj.length;        }        var getCurrItem = function () {            return obj[current];        }        return {            next: next,            isDone: isDone,            getCurrItem: getCurrItem        }    }    var compare = function (iterator1, iterator2) {        while(!iterator1.isDone() && !iterator2.isDone()){            if(iterator1.getCurrItem() !== iterator2.getCurrItem()){                throw new Error ('iterator1和iterator2不相等')            }            iterator1.next();            iterator2.next()        }        alert('iterator1和iterator2相等')    }    var iterator1 = Iterator([1,2,3])    var iterator2 = Iterator([1,2,3])    compare(iterator1,iterator2);//输出iterator1和iterator2相等

模仿jQuery类数组和对象迭代

    $.each = function (obj,callback) {        var value,            i=0,            length = obj.length,            isArray = isArrayLike(obj);        if(isArray) {            for(;i<length;i++){                value = callback.call(obj[i],i,obj[i]);                if(value === false){                    break;                }            }        }else {            for(i in obj){                value = callback.call(obj[i],i,obj[i]);                if(value === false){                    break;                }            }        }        return obj;    }

利用迭代获取浏览器上传插件

有效的避免了多重条件分支语句,通过参数的优先级来确定选择哪一个浏览器上传插件
    var iteratorUploadObj = function () {        for(var i=0,fn;fn = arguments[i++];){            var uploadObj = fn();            if(uploadObj !== false){                return uploadObj            }        }    }    var uploadObj = iteratorUploadObj(getActiveUploadObj, getFlashUploadObj, getFormUploadObj);