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

3y3*_*3y3 0 javascript

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

var a = function(){alert('a');};
var b = function(){alert('b');};
var c = a;
a = function(){c(); b();};
a();
Run Code Online (Sandbox Code Playgroud)

然后我尝试这样做:

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);
Run Code Online (Sandbox Code Playgroud)

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

SLa*_*aks 5

function concat(a, b) {
    return function() { 
        a.call(this, arguments); 
        b.call(this, arguments); 
    };
}
Run Code Online (Sandbox Code Playgroud)

Eval是邪恶的,用正则表达式解析代码更加邪恶.


你甚至可以添加varargs支持:

function concat() {
    var funcs = arguments;
    return function() { 
        for (var i = 0; i < funcs.length; i++)
            funcs[i].call(this, arguments); 
    };
}
Run Code Online (Sandbox Code Playgroud)