`
zhangyaochun
  • 浏览: 2614916 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

关于each的一些思考

阅读更多

 

思考是从jQuery的一段代码开始的。

 

 

jQuery.each({
	slideDown: genFx("show", 1),
	slideUp: genFx("hide", 1),
	slideToggle: genFx("toggle", 1),
	fadeIn: { opacity: "show" },
	fadeOut: { opacity: "hide" }
}, function( name, props ) {
	jQuery.fn[ name ] = function( speed, callback ) {
		return this.animate( props, speed, callback );
	};
});

 

ps:以前明哥问我想要研究js的那些部分,我当时很自然地说了fx.................

 

回到正题,我选的代码是1.4.1,其实在JQuery的源码中你会发现很多这样的模式

 

 

//1.4.1的版本里面大概是23处地方这样的模式
//当然里面的第一个参数可以是[],{}
//下面我就简单地以["bind","one"]举例
jQuery.each(["bind","one"],function(i,name){
         //我这就简单地以jQuery.fn举例  
           jQuery.fn[name] = function(){
               .....................
           }
})

 

好吧 为了让大家明白,我们先来思考一下这种each的实现。

 

第一看看jQuery的each实现。

----ps : 这个each不是$().each

 

 

/*
一些chm或者在线的手册上会告诉你$.each有两个参数
@param {Object}  object ----需要遍历的对象或者数组
@param {Function}  callback(可选)  ---每一个成员执行的回调
但是你看源码的时候你会发现原来有3个参数
*/
each: function( object, callback, args ) {
		var name, i = 0,
                 //object的length       
                 length = object.length,
	//jQuery.isFunction(object) 判断是否是function		
       isObj = length === undefined || jQuery.isFunction(object);

		if ( args ) {
			if ( isObj ) {
				for ( name in object ) {
					if ( callback.apply( object[ name ], args ) === false ) {
						break;
					}
				}
			} else {
				for ( ; i < length; ) {
					if ( callback.apply( object[ i++ ], args ) === false ) {
						break;
					}
				}
			}

		// A special, fast, case for the most common use of each
		} else {
                       //一般我们多走这个,因为没有定义args--undefined
			if ( isObj ) {
                             //for object
				for ( name in object ) {
					if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
						break;
					}
				}
			} else {
                             //for array
				for ( var value = object[0];
					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}
			}
		}
                //返回object
		return object;
	},

 

下面先举一个简单的object参数为array的例子

 

 

/*
我这边定义的object为array 
@i是index
@n是对应objetc[i]
*/
$.each( ["a","b","c"], function(i, n){
		  ( "Item #" + i + ": " + n );
		});

//这个jQuery的$.each在处理object为array的时候的源码
//其实就是开始的时候value是object[0]  //this的指向!!
//如果回调函数返回的不是false的话 value每一次变成 object[++i]
//call的时候参数第一个是object[i]对象;第二个是index--i ;第三个是object[i]
for ( var value = object[0];
					i < length && callback.call( value, i, value ) !== false; value = object[++i] ) {}	

 

 

再看看处理object为{}的例子

 

 

 /*
我这边定义的是object为真正的object {}
回调的参数@param i 是key
               @param n是value
*/

$.each( { name: "zhangyaochun", age: "24" }, function(i, n){
  alert( "Pro: " + i + ", Value: " + n );
});


//我们来看一下jQuery的$.each处理object为{}的时候

for ( name in object ) {
//进行for in的循环
//call的第一个参数是object[name]  //这个this指向!!
//call的第二个参数是name     //属性
//call的第三个参数是object[name] //值
//同样如果回调返回的是false就Break				
if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
						break;
					}
				}

 

 

其实这个问题在我研究tangram和自己编写自己的凤凰lib的时候就开始think....

 

 

/*
*each-traverse a object and follow the iterator to return a obj*
*@function*
*@param {Object} source*
*@param {Function} iterator ---function(item,key)*
*@return {Object}*
*/
ZYC.object.each = function(source,iterator){
    var returnValue,key,item;
	if(typeof iterator == 'function'){
	    for(key in source){
                        //加了一层hasOwnProperty
			if(source.hasOwnProperty(key)){
			   item = source[key];
                          //call的时候this指向的是source
                          //然后后面的参数依次是value和key
			   returnValue = iterator.call(source,item,key);
			}
			//如果有返回值是false的话就break
			if(returnValue === false){
			   break;
			}
	   }
	}
	return  source;
};
 

 

 

最后还是讲一下自己的收获:思考的是一些api实现和动态扩展创建命名空间下的fn的方式,从而结合去编写改善自己的api实现方式

 

我在扩展我的fn的时候也参照了这样$.each的模式,动态的去扩展一下phoenix.fn[key]

1
1
分享到:
评论

相关推荐

    【学海导航】2014版高考英语一轮总复习 Module6 Unit3 Understanding each other同步训练

    这部分训练旨在提升学生的阅读理解能力,理解气候变化如何影响生物种群,并通过具体的实例引导学生思考环境问题。 总的来说,这个单元的训练涵盖了从基础语法到实际应用的多个层面,旨在帮助学生在高考中取得更好的...

    jmeter操作使用大全~~.rar

    本教程集合了关于JMeter的全面操作和使用技巧,旨在帮助用户深入了解并熟练掌握其功能。以下将详细阐述JMeter的基本概念、主要组件以及如何利用它进行接口测试,特别关注"for_each"控制器的运用。 1. **JMeter基础*...

    人教高中英语必修一UnitFriendshipReading教育PPT学习教案.pptx

    - 相互学习,竞争(Learning from each other and competing with each other) 此外,PPT还提出了一个问题,朋友是否必须是人?什么还可以成为你的朋友?这鼓励学生开阔思维,理解友情的多元性。 然后,PPT引入了...

    成人高等教育学士学位英语水平考试真题2018年5月-(1)-附答案详解.doc

    Bruce则尚未决定想去哪所学校,有时间进一步思考(未给出选项)。 通过这些对话,我们可以看出考试重点在于理解日常对话中的语境、逻辑关系以及恰当的选择填空。考生需要具备理解对话上下文、推断人物意图和情感的...

    新目标英语九年级全套PPT课件.pptx

    接着,课件通过配对练习(Match each thing with a place in the picture)来让学生熟悉不同地方可以做什么,例如在邮局买邮票、在银行存钱、在书店买书等,这有助于学生将实际场景与英语词汇相结合,增强他们的语境...

    java夜未眠读书心得.doc

    从这些心得中,我们可以提炼出一些关键的Java编程知识点。 首先,面向对象编程(OOP)是Java的核心概念。"Everything is an object",即万物皆对象,意味着每个实体都可以被封装成一个对象,包含了处理该实体所需的...

    连云港专版2020中考英语复习方案第一篇教材考点梳理第09课时Units1八下试题

    3. 完形填空继续:这个故事可能引导学生思考父女之间的互动和亲情,同时也考察了学生对于上下文线索的理解和推理能力,如第11题的选项可能包括paper, usual, special等,第12题的选项可能包括all, both, each等。...

    python实现批量视频分帧、保存视频帧

    #### 五、扩展思考 除了基本的视频分帧和保存功能外,还可以考虑进一步扩展功能,例如: - 对图片进行压缩以减少存储空间占用。 - 添加多线程或多进程支持以提高处理效率。 - 使用更复杂的图像处理技术(如边缘检测...

    高三英语一轮复习Unit11Keytosuccess课件大纲PPT课件.pptx

    4. These characteristics combine in unique ways in each person, forming various personality types, each composed of different internal workings and external functions. - 这句话揭示了个体差异和个性形成...

    译林牛津英语6A知识点.doc

    17. **卡通时间的游戏与思考**:`play a game`、`tell a story`、`each student`、`on the mountain`、`think hard` 等是描述故事情境的常用短语。 18. **语法:一般过去时**: - 一般过去时用于表示过去发生的...

    全国高考阅读、完形与写作(考前纠错)之书面表达:高考提分秘籍-4页.pdf

    以下是一些关于如何提高高考英语书面表达分数的关键知识点: 1. **高级词汇与句型的运用**:高考评分标准鼓励学生使用高级词汇和复杂句式。例如,在环保话题中,可以使用"pollution"、"global warming"、...

    2013ACM成都赛试题

    ### ACM 2013成都赛试题:游戏在医院(AGameintheHospital) #### 背景 在2013年的ACM国际大学生程序设计竞赛亚洲区域赛...此类问题的解答往往需要深度的逻辑思考和严密的数学证明,体现了ACM竞赛的高难度和综合性。

    小学英语教师课堂用语.ppt

    单复数混淆,如"Each character pronounced as one syllable."应修正为"Each character is pronounced as one syllable."此外,有些教师会使用中文式英语,如"Read together.",更恰当的表达应为"Read it together....

    英语学习:主动“使用英语”.docx

    本文将深入探讨这一方法,并提供一些实践建议。 首先,我们要明白,语言是用来交流的工具,只有真正地运用它,才能更好地掌握。在不同国家,人们有着不同的问候方式,比如握手、鞠躬、拥抱或亲吻脸颊。当我们学习到...

    高三英语高考复习作文常用短语和词组PPT学习教案.pptx

    - 充分利用:make full use of / take advantage of, 适当利用:make proper use of, 互相学习:learn from each other - 给予帮助:help sb. with sth., help sb. (to) do sth., 在某人的帮助下:with the help ...

    英语毕业留言祝福语精选.doc

    以下是一些精选的英语毕业留言祝愿语: 1. "Life is a profound book. Others' notes cannot replace your own understanding. May you find and create something new in it." 这句话鼓励毕业生独立思考,不要依赖...

    外研版高中英语一轮复习精品课件:选修8M3ForeignFood.ppt

    ” 这个问题旨在引导学生思考不同文化背景下饮食习惯的差异,并注意到“for the first time”作为时间状语的用法,它强调的是初次体验。 接着,课件通过实例介绍了一些可能让外国人感到惊讶的中国饮食习惯,如孩子...

    Unit11-I-like-the-Spring-Festival-best梁晓霞(推荐文档).ppt

    在课堂活动的第一阶段,教师引导学生思考并列举他们所知道的节日,例如端午节(Dragon Boat Festival)、重阳节(Chongyang Festival)和中秋节(Mid-autumn Festival)。 接着,课程介绍了春节期间的一些习俗。在...

    江西省萍乡市芦溪县宣风镇中学九年级英语全册 Unit 9 When was it invented Reading学案(无答案)

    - `Players move towards one end of the court while throwing the ball to each other.`:球员们一边将球传给对方,一边向球场的另一端移动。 3. **语法点:一般过去时的被动语态**: 一般过去时的被动语态用于...

    小学英语英语故事儿童故事ASingle_logBridge

    1. 故事教育意义:这个小学英语故事《ASingle_logBridge》通过两只固执的山羊的故事,教育孩子们关于谦让和合作的重要性。故事中的两只山羊因为互不相让而导致了悲剧的发生,提醒孩子们在面对冲突时,应该学会互相...

Global site tag (gtag.js) - Google Analytics