• 读jQuery源码有感3


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

    当看到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用来干什么,就可以使用了。

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

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

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

  • 相关阅读:
    eclipse禁用svg文件Validation
    在centos上安装jenkins
    5.volatile的应用
    4.资源限制
    linux git保存用户名密码(避免每次push输用户名密码)
    mysql 从库落后主库太多优化
    mfs使用指引
    Asura监控---AsuraMonitor,阿修罗监控开源
    docker overlay网络实现
    ELK+kafka日志收集
  • 原文地址:https://www.cnblogs.com/samwu/p/3475495.html
Copyright © 2020-2023  润新知