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);
模仿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);