自己写的一个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>