有可能/操纵/函数,因为它是字符串?

时间:2012-09-05 14:41:24

标签: javascript function semantics

var myString = '';
myString += 'foo';
myString += 'bar';
myString = myString.replace(/oba/, 'qux');

console.log(myString) // produces "foquxr"

有没有办法同样修补功能,例如转动function(a) { a += 'b'; return a; }信息function(a) { a += 'b'; console.log(a); return a + 'c'; }

2 个答案:

答案 0 :(得分:3)

您可以compose函数

// (compose(f, g))(x, y, ...) is the same as f(g(x, y, ...)) 
function compose(f, g) {
  return function (var_args) {
    return f.call(this, g.apply(this, arguments));
  };
}

所以

var f = compose(
  function (x) { console.log(x); return x + 'c'; },
  function (a) { a += 'b'; return a; });

允许您组合两个小函数来获得行为类似于

的函数
function(a) { a += 'b'; console.log(a); return a + 'c'; }

答案 1 :(得分:2)

你可以通过从声明中获取函数的主体,根据需要操作它,并通过eval构造函数重新定义它来实现这一点(不使用Function()):

function myFunction(a) { a += 'b'; return a; }

function changeFunction(){
    var func = window['myFunction'].toString();
    var body = func.substring(func.indexOf("{")+1, func.lastIndexOf("}"));
    body = body.replace("return a;", "console.log(a); return a + 'c';");
    window.myFunction = Function("a", body);
}​

这是JSFiddle