[英]Can you turn an anonymous method (function) into a named method dynamically?
給定此方法:
var obj = {}, obj.foo = function () {};
創建方法后是否可以為其分配名稱,其外觀類似於:
var obj = {}, obj.bar = function bar() {};
foo方法是匿名的,並已分配給屬性。 bar方法已命名並分配給屬性。
您可以動態地將匿名foo方法轉換為命名foo方法嗎? 函數對象上是否有可以設置的屬性或類似以下內容的屬性:
obj.foo.<name> = Object.keys(obj)[0];
請不要使用jquery。 此外,這是在節點服務器應用程序中,因此跨瀏覽器問題將無關緊要。
編輯:對我有用的答案是Daniel的鏈接: 如何在Javascript中動態設置功能/對象名稱,因為它在Chrome中顯示 。 此方法還處理該函數的參數。
您不能重新命名匿名函數的精確實例,但是可以使用閉包來重新定義它,從而更改其名稱,如下所示:
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);
}
總結了上面提到的其他帖子中找到的兩種解決方案:
2) 如何在Javascript中動態設置功能/對象名稱(在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;
他們倆都工作。 第二種解決方案比較復雜,但是我不確定它增加了什么。
更新:第二種解決方案是更好的解決方案。 它可以處理第一個解決方案無法處理的函數參數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.