js克隆函数function

585 阅读1分钟
function cloneFunction(func) {
    // 在正则表达式中dot( ".")几乎匹配任意一个字符,但是不匹配换行符\n。
    // ?<= : 询问要去匹配的目标是否以这个东西开头;?= : 询问要去匹配的目标的后面跟着的东西是否等于这个
    const bodyReg = /(?<={)(.|\n)+(?=})/m; // 匹配方法体
    const paramReg = /(?<=().+(?=)\s+{)/; // 匹配参数
    const funcString = func.toString();
    // 判断是箭头函数还是普通函数,箭头函数没有prototype  
    if (func.prototype) {
        console.log('普通函数');
        const param = paramReg.exec(funcString);
        const body = bodyReg.exec(funcString);
        if (body) {
            console.log('匹配到函数体:', body[0]);
            if (param) {
                const paramArr = param[0].split(',');
                console.log('匹配到参数:', paramArr);
                return new Function(...paramArr, body[0]);
            } else {
                return new Function(body[0]);
            }
        } else {
            return null;
        }
    } else {
        return eval(funcString);
    }
}

与之相关的# 正则表达式的零宽断言:?=、?<=、?!、?<! 的具体使用区别

1、将 < 看成方向,包含这个箭头说明是放在要去匹配的目标内容的左边(来开头)
2、把 ?! 看成 ?!= 就好了
3、一定要记住:匹配得到的结果并不包含 ?=、?<=、?!和?<!=里面的内容的

?=、?<=、?!、?<! 的具体使用区别:

【1】?= : 询问要去匹配的目标的后面跟着的东西是否等于这个 eg: ^b(?=a)——ba2?<=:询问要去匹配的目标是否以这个东西开头eg:(?<=a)b —— ba 【2】?<= : 询问要去匹配的目标是否以这个东西开头 eg: ^(?<=a)b —— ab 【3】?! : 询问要去匹配的目标后面跟着的东西是否 不是这个 eg:^b(?!a)——bb4?<!=:询问要去匹配的目标是否不是以这个东西开头eg(?<!=a) —— bb 【4】?<!= :询问要去匹配的目标是否不是以这个东西开头 eg:^(?<!=a) —— bb

官方例子:

?= exp1(?=exp2): 查找在 exp2 前面的 exp1。
?<= (?<=exp2)exp1: 查找在 exp2 后面的 exp1。
?! exp1(?!exp2): 查找后面不是 exp2 的 exp1。
?<! (?<!exp2)exp1:查找前面不是 exp2 的 exp1。