2015-04-04 33 views
1

鑑於這種方法:你可以將一個匿名方法(函數)動態地變成一個命名方法嗎?

var obj = {}, obj.foo = function() {}; 

是它的創建後,所以它看起來相似,它可以分配方法的名稱:

var obj = {}, obj.bar = function bar() {}; 

foo的方法是匿名的,分配給一個屬性。 bar方法被命名並分配給一個屬性。

你可以將匿名foo方法動態地變成一個名爲foo的方法嗎?是否有可以設置或類似的功能對象的屬性:

obj.foo.<name> = Object.keys(obj)[0]; 

請不要使用jquery。此外,這是在節點服務器應用程序中,因此跨瀏覽器問題將無關緊要。

編輯:對我有效的答案是丹尼爾的鏈接:How to dynamically set a function/object name in Javascript as it is displayed in Chrome。這種方法也處理函數的參數。

+2

爲什麼你需要這樣的功能? – 2015-04-04 17:30:24

+0

除非您願意獲取函數的字符串值(即JavaScript源代碼),修改該函數並從中創建新函數,否則沒有辦法做到這一點。你想達到什麼目的?無論如何,函數外部的'function'表達式中給出的名字在函數外部是不可見的。 – Pointy 2015-04-04 17:30:36

+0

[命名匿名函數]可能的重複(http://stackoverflow.com/questions/3854141/naming-an-anonymous-function) – 2015-04-04 17:32:35

回答

0

總結在上面提到的其他職位找到了兩個解決方案:

1)Dynamic function name in javascript?

2)How to dynamically set a function/object name in Javascript as it is displayed in Chrome

var foo, bar, name = "bar", renameFunction; 

foo = function() {return "baz";} 
bar = foo; 
console.log(bar.name + "/" + bar()); ///baz; 

//*************** Solution #1 ********************************************** 
renameFunction = function (name, fn) { 
    return (new Function("noName", "return function " + name + 
     "(){ return noName() };")(fn)); 
} 
bar = renameFunction(name, foo); 
console.log(bar.name + "/" + bar()); // bar/baz; 

//*************** Solution #2 ********************************************** 
renameFunction = function (name, fn) { 
    return (new Function("return function (call) {return function " + name + 
     "() { return call(this, arguments) }; };")())(Function.apply.bind(fn)); 
}; 
bar = renameFunction(name, foo); 
console.log(bar.name + "/" + bar()); // bar/baz; 

他們都工作。第二種解決方案更復雜,但我不確定它增加了什麼。

更新:第二個解決方案是更好的。它可以處理第一個解決方案沒有的函數的參數。

1

你不能renane您的匿名函數是精確的實例,但你可以使用閉包來重新定義它改變它的名字,像這樣:

var obj = {}; 

// Anonymous function 
obj.foo = function() {/* whatever */}; 

// Renaming... 
obj.foo = (function(fn) { 
    return function foo() { 
     return fn.apply(this, arguments); 
    } 
})(obj.foo); 

// Now try in the console: 
obj.foo 
> function foo() { 
    return fn.apply(this, arguments); 
} 
+1

@ChrisGciso我正在測試,我會告訴你,如果我找到 – 2015-04-04 18:38:19

相關問題