fn有toString方法 string没有toFunction方法 自定义一个toFunction方法

2018-04-18 12:30:32javascriptjs

更新:
感谢 @行列[xxooyy] 给了一个更加精简的方法实现:

String.prototype.toFunction=function(){ return eval('('+this+')')};
//重点在'('和')'
String.prototype.toFunction = function () {
    var fnString = this.toString();
    var preRs = "^function\\s*[a-zA-Z]*?\\([\\s\\S]*?\\)\\s*\\{";
    var endRs = "\\}$";
    var argRs = "^function\\s*[a-zA-Z]*?\\(|\\)\\s*\\{|\\s*";
    var preReg = new RegExp(preRs, 'i');
    var endReg = new RegExp(endRs);
    var argReg = new RegExp(argRs, 'g');
    var preEndReg = new RegExp(preRs + '|' + endRs, 'gi');
    if (preReg.test(fnString)) {
        var preEnd = fnString.match(preEndReg);
        var fnArguments = preEnd[0].replace(argReg, '').split(',');
        var fnBody = fnString.replace(preEndReg, '');
        var fn = new Function(fnArguments, fnBody);
        return fn;
    } else {
        return fnString;
    }
}

'function (a) { console.log(a); }'.toFunction();
//function anonymous(a) { console.log(a); }

方法很笨拙,不知道有没有大神给改改的,或者有什么可替换的系统方法。
https://jsfiddle.net/jsoncode/8vsvL96n/embedded/js,result/dark/

总结一行神奇的代码:

var fn = function (){};
new Function('return '+Function.prototype.toString.call(fn));
//会还原到fn

热门评论:

  • 行列 行列 2016-11-12 10:36 回复:

    String.prototype.toFunction=function(){return eval('('+this+')')};


  • 行列 行列 2016-11-14 9:43 回复:

    我eval前后有()号的啊,你再仔细看看我的代码


  • 行列 行列 2016-11-10 11:17 回复:

    eval(this)不就可以了?


  • jsoncode jsoncode 2016-11-10 2:15 回复:
    怎么eval?eg...

  • jsoncode jsoncode 2016-11-14 8:26 回复:
    比如eval('function (a) { console.log(a); }')好像会报错

  • jsoncode jsoncode 2016-11-14 1:59 回复:
    var fn = 'function (a) { console.log(a); }';
    eval('('+fn+')');

多谢,简单优雅,之前也用过eval函数,由于不好控制,所以最近用的少了


  • 风雨中的狼 风雨中的狼 2018-4-4 4:07 回复:

    想定义的的函数名字,是动态的传变量,再通过这个变量名字引用,能实现吗
    var window['show']='function(name){ console.info(name)}'.toFunction();
    show('校长');