是否可以更容易地组合这些功能?

时间:2012-01-30 02:03:41

标签: javascript

我需要结合一些功能(修改第一个功能),但我不能这样做(它有效,但对我不好):

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);

它有效,但可能存在更简单的方法吗?

1 个答案:

答案 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); 
    };
}