这次的主题是,具体的库和抽象的思路。

当看到Deferred这个区块时,觉得jQuery代码设计挺复杂,得用许多脑力才能看明白。

可是把这个峰回路转十八回的代码看懂又如何,是为了使用过程中出现bug后,容易调试吗?还是重新造个轮子?

我觉得需求撑大的库,当你不知道它撑大的历史,而贸然阅读,容易一头雾水。

所以从简单的具体开始,

1.没有参数传递,只有第一个函数有定时器的情况

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>没有参数传递,只有第一个函数有定时器的情况</title>
<script type="text/javascript">
var dfd = {};
dfd.resolve = function() {
var list = dfd.promise.list;
for(var i=0, l= list.length; i < l ; i++){
list[i]();
}
}
dfd.promise = {};
dfd.promise.list = [];
dfd.promise.then = function(fn_arg) {
dfd.promise.list.push(fn_arg);
return dfd.promise;
} function f1() { setTimeout(function() {
console.log("1");
dfd.resolve();
}, 1000); return dfd.promise;
} function f2(){
console.log("2");
}
function f3(){
console.log("3");
}
f1().then(f2).then(f3); </script>
</head>
<body>
没有参数传递,只有第一个函数有定时器的情况
</body>
</html>

2.没有参数传递,都有定时器的情况

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>没有参数传递,都有定时器的情况</title>
<script type="text/javascript">
var dfd = {};
dfd.resolve = function() {
var list = dfd.promise.list;
list.shift()();
}
dfd.promise = {};
dfd.promise.list = [];
dfd.promise.then = function(fn_arg) {
dfd.promise.list.push(fn_arg);
return dfd.promise;
} function f1() { setTimeout(function() {
console.log("1");
dfd.resolve();
}, 1000); return dfd.promise;
} function f2(){
setTimeout(function() {
console.log("2");
dfd.resolve();
}, 1000);
return dfd.promise;
} function f3(){
setTimeout(function() {
console.log("3");
}, 1000);
}
f1().then(f2).then(f3); </script>
</head>
<body> </body>
</html>

3.都有参数传递,都有定时器的情况

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>都有参数传递,都有定时器的情况</title>
<script type="text/javascript">
var dfd = {};
dfd.resolve = function(arg) {
var list = dfd.promise.list;
list.shift()(arg);
}
dfd.promise = {};
dfd.promise.list = [];
dfd.promise.then = function(fn_arg) {
dfd.promise.list.push(fn_arg);
return dfd.promise;
} function f1() { setTimeout(function() {
console.log("3");
dfd.resolve(5);
}, 1000); return dfd.promise;
} function f2(num){
setTimeout(function() {
console.log(num);
dfd.resolve(7);
}, 1000);
return dfd.promise;
} function f3(num){
setTimeout(function() {
console.log(num);
}, 1000);
}
f1().then(f2).then(f3); </script>
</head>
<body> </body>
</html>

至于库的演变过程,你想靠svn,git的提交记录知道,是不大可能。

除非造库的那个人,手把手教你从头开始打造这个库。

或者,每次库的重要变化时,他都用视频记录下来,并且以教程的方式展示。

我觉得,可以适当改变这种以行的方式来敲代码,改为以帧的方式来画代码。

这样,你才能清晰地看到,库的从无到有。

具体的库对外开放api,你只要知道这些个api用来干什么,就可以使用了。

方便是方便,但用多了,唯恐不知道其原理。

如果你知道其原理,然后再依据需求(如同营养),一步一步使库枝繁叶茂。

那么,拈花飞叶,便可伤人。

读jQuery源码有感3的更多相关文章

  1. 读jQuery源码有感

    读之前的预备工作: 1.基础的js知识,以及html和css知识,和正则表达式知识.可以参考妙味课堂的基础js,html和css大纲. 2.JavaScript核心指南的知识http://www.cn ...

  2. 读jQuery源码有感2

    那么就来读读jQuery源码的Callbacks部分. 一上来看原版源码 jQuery.Callbacks = function( options ) { // Convert options fro ...

  3. 【读jQuery源码有感系列一】callee

    <script type="text/javascript"> /*调用自身*/ function calleeDemo() { try{ } catch (error ...

  4. 读jQuery源码 - Deferred

    Deferred首次出现在jQuery 1.5中,在jQuery 1.8之后被改写,它的出现抹平了javascript中的大量回调产生的金字塔,提供了异步编程的能力,它主要服役于jQuery.ajax ...

  5. 读jQuery源码之整体框架分析

    读一个开源框架,大家最想学到的就是设计的思想和实现的技巧.最近读jQuery源码,记下我对大师作品的理解和心得,跟大家分享,权当抛砖引玉. 先附上jQuery的代码结构. (function(){ / ...

  6. 【读fastclick源码有感】彻底解决tap“点透”,提升移动端点击响应速度

    申明!!!最后发现判断有误,各位读读就好,正在研究中.....尼玛水太深了 前言 近期使用tap事件为老夫带来了这样那样的问题,其中一个问题是解决了点透还需要将原来一个个click变为tap,这样的话 ...

  7. 读jQuery源码 - Callbacks

    代码的本质突出顺序.有序这一概念,尤其在javascript——毕竟javascript是单线程引擎. javascript拥有函数式编程的特性,而又因为javascript单线程引擎,我们的函数总是 ...

  8. 读jQuery源码释疑笔记2

    本释疑笔记是针对自己在看源码的过程中遇到的一些问题的解答,对大众可能不具有参考性,不过可以看看有没有你也不懂得地方,相互学习,相互进步. 1.函数init <div id="one&q ...

  9. 读jQuery源码释疑笔记

    本释疑笔记是针对自己在看源码的过程中遇到的一些问题的解答,对大众可能不具有参考性,不过可以看看有没有你也不懂得地方,相互学习,相互进步.  1.each的用法 之前对each的用法一直迷迷糊糊,这次终 ...

随机推荐

  1. TI CC254x BLE教程 4

    TI的CC254x芯片 1. SoC 2. RF收发器+8051MCU 128/256KB Code空间. 3. Master或者Slave 4. 可编程flash 5. 8KB SRAM 6. 全软 ...

  2. 28、Oracle(四)用户权限控制

    一)用户Oracle中的用户分为二大类1)Oracle数据库服务器创建时,由系统自动创建的用户,叫系统用户,如sys.2)利用系统用户创建的用户,叫普通用户,如scott,hr,c##tiger,zh ...

  3. run loop 输入源

    做了一年多的IOS开发,对IOS和Objective-C深层次的了解还十分有限,大多还停留在会用API的级别,这是件挺可悲的事情.想学好一门语言还是需要深层次的了解它,这样才能在使用的时候得心应手,出 ...

  4. Python使用报错记录

    问题1:pip 报错 C:\Users\Administrator>pip3 install pyreadline Fatal error in launcher: Unable to crea ...

  5. POJ 1260:Pearls(DP)

    http://poj.org/problem?id=1260 Pearls Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 8 ...

  6. 还原数据库,恢复SQLSERVER登录名的问题

    还原SQLSERVER数据库,原来的数据库的于当前SQLSERVER同名用户就不能再登录了,原因是当前SQLSERVERD的master数据库的sysxlogins表的的sid与还原后的数据库的sys ...

  7. java 判断某一天是当年的哪一天

    题目:输入年份,月份,日,判断这一天是这一年的第几天?(闰年的2月份为29天,平年为28天) public class Runnian { /** * 能被4整除且不能被100整除或者能被400整除的 ...

  8. Redis 安装 启动 连接 配置 重启

    Linux下安装 ]# wget http://download.redis.io/releases/redis-2.8.17.tar.gz ]# .tar.gz ]# cd redis- ]# ma ...

  9. Alignment

    Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14547 Accepted: 4718 Descriptio ...

  10. Stars(树状数组或线段树)

    Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 37323 Accepted: 16278 Description A ...