javascript - 来来来,我们分析哈一段代码
高洛峰
高洛峰 2017-04-10 15:54:29
[JavaScript讨论组]
;(function ( window, doc, undef ) {

    var topics = {},
        subUid = -1,
        pubsubz ={};

    pubsubz.publish = function ( topic, args ) {

        if (!topics[topic]) {
            return false;
        }

        setTimeout(function () {
            var subscribers = topics[topic],
                len = subscribers ? subscribers.length : 0;

            while (len--) {
                subscribers[len].func(topic, args);
            }
        }, 0);

        return true;

    };

    pubsubz.subscribe = function ( topic, func ) {

        if (!topics[topic]) {
            topics[topic] = [];
        }

        var token = (++subUid).toString();
        topics[topic].push({
            token: token,
            func: func
        });
        return token;
    };

    pubsubz.unsubscribe = function ( token ) {
        for (var m in topics) {
            if (topics[m]) {
                for (var i = 0, j = topics[m].length; i < j; i++) {
                    if (topics[m][i].token === token) {
                        topics[m].splice(i, 1);
                        return token;
                    }
                }
            }
        }
        return false;
    };

    getPubSubz = function(){
        return pubsubz;
    };

    window.pubsubz = getPubSubz();

}( this, this.document ));

这段代码中setTimeout的作用是什么

    getPubSubz = function(){
        return pubsubz;
    };

    window.pubsubz = getPubSubz();

为什么不写成

window.pubsubz = pubsubz;

window, doc, undef这几个参数的作用又是什么

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(1)
伊谢尔伦

如果不要setTimeout包裹,你这个发布订阅模式就是同步的,意味着

pubsubz.subscribe('topic', fun1);
pubsubz.publish('topic');
pubsubz.subscribe('topic', fun2);

这样的顺序只会执行fun1,fun2不会被执行,因为是同步的。
加了setTimeout之后,上面的代码顺序,会让fun1,fun2都被执行。

对外暴露那部分,我没想到有啥区别。

最后这个立刻执行函数传递的参数是(this, this.document),而this就是window。
行参表明了实参的含义,这个没问题吧?为什么要这么做呢?原因就是确保模块的封装合理性,避免冲突的写法。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号