jQuery源码分析之Callbacks详解(6)

但是在jQuery里采用了更奇妙的用法,获取jQuery作者也自豪这种用法,所以命名这个模型为memory——就是让上面的变量auto不仅仅表示当前是auto执行模式,并且作为最后一次参数的容器,它既表示了auto,也表示了memory。(下面的代码非jQuery是根据jQuery代码思路而写,非源码):

复制代码 代码如下:


(function (window, undefined) {
            var Callbacks = function (auto) {
                var list = [],
                    fired,
                    memory,//主演在这里,就是memory
                    coreFire = function (data) {
                        //真正的触发函数方法
                        if (list) {
                            //&&表达式妙用
                            memory = auto && data;//记录最后一次的参数,如果不是auto模式则不会记录这个参数
                            //如果是auto模式,那么这个auto将不会为false,它会是一个数组
                            fired = true;
                            for (var i = 0, len = list.length; i < len; i++) {
                                if (list[i].apply(data[0], data[1]) === false)
                                    break;
                            }
                        }
                    };
                return {
                    add: function (fn) {
                        if (list) {
                            //添加一个回调函数
                            list.push(fn);
                            //自动执行模式,注意如果auto模型
                            //memory是在coreFire()里赋值的,默认是false
                            if (memory) coreFire(auto);
                        }
                        //支持链式回调
                        return this;
                    },
                    fireWith: function (context, data) {
                        if (once) list = [];
                        //这里调用coreFire,把参数转换为数组了
                        coreFire([context, data]);
                        return this;
                    }
                    /*部分代码省略*/
                };
            };
            window.Callbacks = Callbacks;
        }(window));

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgfzyd.html