簡體   English   中英

您可以動態地將匿名方法(函數)轉換為命名方法嗎?

[英]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);
}

總結了上面提到的其他帖子中找到的兩種解決方案:

1) JavaScript中的動態函數名稱?

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM