javaScript——迭代器模式

迭代器模式是指提供一种方法顺序访问一个聚合对象中的各个元素,而不需要暴露该对象的内部表示。迭代器模式可以把迭代的过程从业务逻辑当中分离出来,在使用迭代模式之后,即不关心对象的内部构造,也可按顺序访问其中的每个元素。
关键是可以按照顺序访问其每个元素,关键是可以将迭代的过程从业务逻辑当中分离出来。设计模式一书提出单一职责原则
如下注释掉的代码自动忽略。其实注释掉的代码也是一个知识点,如何拿到循环当中的每个值。

//var handler=function(e){
			// console.log(e)
//}
var each = function(ary,callback){
			for(var i=0,l=ary.length;i<l;i++){
				// console.log(i);
				// ary[i].addEventListener('click',handler,false)
// 				(function(i){
// 					return ary[i].οnclick=function(){
// 									// console.log(i)
// 								}
// 				})(i)
				callback.call(ary[i],i,ary[i])		//回调函数能拿到每一个i
			}
		}
		var liArg=document.querySelectorAll('ul li');
		// console.log(typeof liArg,Array.isArray(liArg))
		each(liArg,function(i,item){
			// console.log(i,item)		//可以获取每个i
		})

each函数就是一个内部迭代器,内部迭代器外界不用关心迭代器内部的实现,跟迭代器的交互仅仅是第一次初始交互。内部迭代器的缺点是无法迭代2个数组。那么还有外部迭代器,外部迭代器必须显式的请求迭代的下一个元素。其实就是把业务规则,比如比较某某和某某之间是否相等封装起来。那么某某和某某又是2个不同的函数。这就相当于分离了迭代比较函数和业务函数。实现单一职责原则。
1、倒序迭代器
倒序迭代器其实相对来说用的地方还是很多的,想想数组的删除会改变数组的长度,那么我们就不能使用正序循环,那么我们可以使用倒序啊。

var reverseEach = function(ary,callback){
	for(var i=ary.length-1;i>=0;i--){
				callback.call(ary[i],i,ary[i])		//回调函数能拿到每一个i,
		}
	}

2、中止迭代器
中止迭代器也相对简单,就是用一个条件来中止循环呗。
3、迭代模式的运用
提供一个可以被迭代的方法,使得被迭代的对象依照(优先级)被循环迭代。
如果正在被迭代的函数返回一个对象,则表示找到了正确的对象,反之如果该函数返回false,则让迭代器继续工作。

// 被迭代的对象(迭代器)
var getActiveUploadObj=function(){
			try{
				return new ActiveXObject('.ext')
			}catch(e){
				return false;
			}
		}
		// 提供一个可以被迭代的方法,依照优先级被循环迭代(迭代的方法)
var iteratorUploadObj=function(){
	for(var i=0,fn;fn=arguments[i++]){
		var uploadObj=fn();
			if(uploadObj!==false){
				return uploadObj;
			}
	}
}
iteratorUploadObj(obj1,obj2)//这是有顺序的参数表示哪个优先级更高

猜你喜欢

转载自blog.csdn.net/Miss_hhl/article/details/103618937