javascript 自己主动绑定JS callback 的方法函数

自己写的一个javascript 智能绑定callback 而且调用运行的函数。主要用于异步请求的 ajax中:

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
</head>
<body>

<script>
    /**
     * @author default7@zbphp.com
     * @date 2014-10-17
     * @description 通过传入的參数获取出函数名称
     * @param args
     * @returns {string}
     */
    function getFunctionName(args) {
        var fName = '';
        if (typeof  args == 'string' && /^[a-zA-Z0-9]+$/.test(args)) {
            fName = args;
        } else {
            var fBody = '';
            if (typeof args == 'object' && args.callee) {
                fBody = args.callee.toString();
            } else if (typeof  args == 'string') {
                fBody = args;
            }

            if (fBody) {
                var m = fBody.match(/function\s+([a-zA-Z0-9]+)\s*\(/i);
                if (m && m[1]) {
                    fName = m[1];
                }
            }
        }
        return fName;
    }

    var gCallback = [];
    function addCallback(fName, callback) {
        if (typeof fName == 'string' && typeof window[fName] == 'function' && typeof callback == 'function') {
            if (typeof gCallback[fName] == 'undefined') {
                gCallback[fName] = [];
            }
            gCallback[fName].push(callback);
        }
    }

    /**
     * @description 运行绑定的函数
     * @param args
     */
    function execCallback(args) {
        var fName = getFunctionName(args);
        if (fName && window[fName] && gCallback[fName]) {
            for (var i in gCallback[fName]) {
                gCallback[fName][i]();
            }
            gCallback[fName] = [];//仅仅调用一次
        }
    }
</script>


<script>
    function a() {
        alert('a');
    }

    function b() {
        alert('b');
    }

    function c() {
        alert('c');
    }
    function d() {
        alert('d');
    }


    function initUser() {
        execCallback(arguments);

    }

    addCallback('initUser', a);
    addCallback('initUser', b);
    addCallback('initUser', c);

    initUser();
    addCallback('initUser', d);
    initUser();

</script>
</body>
</html>



posted @ 2016-01-18 14:20  mfrbuaa  阅读(479)  评论(0编辑  收藏  举报