为了账号安全,请及时绑定邮箱和手机立即绑定

list哪来的啊

 46行,deferred[tuple[0] + "With"] = list.fireWith;

上面的list是从哪里来的啊,貌似没有定义啊


正在回答

2 回答

慕课上由于课程的关系,有些地方可能需要看源码,没有很细的深入:


摘自我正在写的书(jQuery框架设计与实现)部分解释:

    jQuery在代码上的设计,最喜欢的就是合并很多相似功能的代码,达到省代码量的目的。deferred对象中有很多的方法,但是实际上在定义的部分jQuery并没有一个一个指定接口与对应方法。Deferred方法中定义了一个数据元组集, 每个元组分别包含一些与当前deferred相关的信息。

     deferred相关的数据元组集:这是一个很有抽象的合并设计,promise规范指明了内部会有三个状态成功、失败、进行中,通过指定的方法来修改这些状态,那么我们在合并的时候可以把同类状态与方法都写到一个数组中,就出现了这样的一种合并设计了。

var tuples = [
         ["resolve", "done", jQuery.Callbacks("once memory"), "resolved"],
         ["reject", "fail", jQuery.Callbacks("once memory"), "rejected"],
         ["notify", "progress", jQuery.Callbacks("memory")]
]

每一组数组集,代表的意思:

1.触发回调函数列表执行(函数名),
2.添加回调函数(函数名)
3.回调函数列表(jQuery.Callbacks对象)
4.deferred最终状态(第三组数据除外)

如何使用?我们通过循环取出每个数组中的定义,然后赋给不同的对象去操作,这里定义2个对象 一个promise,一个deferred。

var promise = {},deferred = {};
for (var i = 0; i < tuples.length; i++) {
         var triggerName  = tuples[i][0] //触发器方法 resolve、reject、notify
         var callbackName = tuples[i][1] //监听的回调 done、fail、progress
         var operate      = tuples[i][2] //具体操作的方法 callback对象
         var statusName   = tuples[i][3] //状态值 resolved、rejected
 
         //给promise上附加done、fail、progress,
         //对应的回调用callback.add保存
         promise[ callbackName ] = operate.add;
 
         //触发方法
         // resolve、reject、reject
         deferred[ triggerName ] = function() {
                   deferred[ triggerName+ "With" ]( this === deferred ? promise : this, arguments );
                   return this;
         };
         //resolveWith、rejectWith、rejectWith
         deferred[triggerName + "With" ] = operate.fireWith;
}

循环数据元组集,然后把接口与方法都混入到了对应的deferred与promise对象上了

        promise与deferred对象上对应的方法就是jQuery针对Promise规范的一种扩展,但是核心来说都是基于回调模式,jQuery就抽出了一个jQuery.Callbacks是模块专门来处理这种回调逻辑。done|faile|progress 就是Callbacks.add方法增加一个监听函数, resolve、reject、notify就是触发对应的回调,通过Callbacks. fireWith来处理。


http://img1.sycdn.imooc.com//55641c570001480606340262.jpg

3 回复 有任何疑惑可以回复我~

它没写全吧···我去看的源码 jquert-2.0.0.js 里是这样写的 #前面还有一些代码,有定义设置list#

// Add list-specific methods
		jQuery.each( tuples, function( i, tuple ) {
			var list = tuple[ 2 ],
				stateString = tuple[ 3 ];

			// promise[ done | fail | progress ] = list.add
			promise[ tuple[1] ] = list.add;

			// Handle state
			if ( stateString ) {
				list.add(function() {
					// state = [ resolved | rejected ]
					state = stateString;

				// [ reject_list | resolve_list ].disable; progress_list.lock
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
			}

			// deferred[ resolve | reject | notify ]
			deferred[ tuple[0] ] = function() {
				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
				return this;
			};
			deferred[ tuple[0] + "With" ] = list.fireWith;
		});


2 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
jQuery源码解析(架构与依赖模块)
  • 参与学习       84047    人
  • 解答问题       280    个

由浅入深地剖析jQuery库的设计与实现,揭开框架背后的秘密

进入课程

list哪来的啊

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信