我需要结合一些功能(修改第一个功能),但我不能这样做(它有效,但对我不好):
var a = function(){alert('a');};
var b = function(){alert('b');};
var c = a;
a = function(){c(); b();};
a();
然后我尝试这样做:
var a = function(){alert('a');};
var b = function(){alert('b');};
var rx = /^[\s\S]*\(([\s\S]*)\)\s*{([\s\S]*)}$/;
concat = function(f1,f2)
{
var q = f1.toString().replace(rx,'$1|$2').split('|');
var w = f2.toString().replace(rx,'$1|$2').split('|');
return (q[0]!=='' && w[0]!=='')?
new Function(q[0]+','+w[0],q[1]+w[1]):
(q[0]!=='')?
new Function(q[0],q[1]+w[1]):
new Function(w[0],q[1]+w[1]);
};
a = concat(a,b);
alert(a);
它有效,但可能存在更简单的方法吗?
答案 0 :(得分:5)
function concat(a, b) {
return function() {
a.call(this, arguments);
b.call(this, arguments);
};
}
Eval是邪恶的,用正则表达式解析代码更加邪恶。
您甚至可以添加varargs支持:
function concat() {
var funcs = arguments;
return function() {
for (var i = 0; i < funcs.length; i++)
funcs[i].call(this, arguments);
};
}