2012-08-08 73 views
2

我正在做一些元編程,使用Function constructor從組合字符串創建函數。使用函數構造函數創建函數的內部引用

構造函數Function允許指定參數名稱和主體,但似乎沒有任何方法指定函數的名稱。

這意味着,似乎沒有被提及的功能,從內部本身在符合標準的方式方法(arguments.callee被棄用ES5並嚴格禁止模式)。如果我寫文字函數聲明,我可能只是這樣做:

function myFunc(a, b, c) { 
    if (c) { 
     return myFunc(a, b); 
    } 
    return 0; 
} 

有什麼辦法來達到這種效果,如果我不是建立使用Function()該函數(不使用eval())?

回答

1

如果您目前正在做這樣的事情:

var f = new Function(argName, stringContainingCode); 

,那麼你可以改爲做:

var f = new Function("return function " + functionName + "(" + argName + ") { " + stringContainingCode + "}")(); 

換句話說,構建具有給定名稱返回它的包裝裏面的功能。

+0

太棒了!它看起來性能不是太糟糕:http://jsperf.com/function-inception – kpozin 2012-08-08 14:54:00

0

讓一個變量等於新的功能可按

var myFunc = new Function(x, "return 2 * x ") ; 

然後可以使用參考功能照常

myFunc(7) ; // returns, like, 9 or something 
0

怎麼樣的內部命名的功能?

function myFunc(a, b, c) { 
    return (function _myFunc(a, b, c) { 
     if (c) { 
      return _myFunc(a, b); 
     } 
     return 0; 
    })(a, b, c); 
} 
相關問題