【问题标题】:Can you turn an anonymous method (function) into a named method dynamically?你能动态地将匿名方法(函数)变成命名方法吗?
【发布时间】:2015-04-04 17:26:47
【问题描述】:

鉴于此方法:

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

是否可以在创建方法后为其指定名称,使其看起来类似于:

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

foo 方法是匿名的并分配给一个属性。 bar 方法被命名并分配给一个属性。

你能把匿名的 foo 方法动态地变成一个命名的 foo 方法吗?函数对象上是否有可以设置的属性或类似于:

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

请不要使用 jquery。此外,这是在节点服务器应用程序中,因此跨浏览器问题无关紧要。

编辑: 对我有用的答案是 Daniel 的链接:How to dynamically set a function/object name in Javascript as it is displayed in Chrome。这种方法还处理函数的参数。

【问题讨论】:

  • 为什么需要这样的功能?
  • 除非你愿意获取函数的字符串值(即它的 JavaScript 源代码),修改它,然后从中创建一个新函数,否则没有办法做到这一点。你想达到什么目的?无论如何,在 function 这样的表达式中给出的名称在函数外部是不可见的。
  • @ChrisGciso 不是真的;可能在各个地方都有对原始函数的引用。

标签: javascript node.js function anonymous-function v8


【解决方案1】:

你不能重命名你的匿名函数的精确实例,但你可以使用闭包来重新定义它,改变它的名字,像这样:

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);
}

【讨论】:

  • @ChrisGciso 我正在测试,如果有什么发现我会告诉你
【解决方案2】:

总结上面引用的其他帖子中找到的两种解决方案:

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;

它们都有效。第二种解决方案更复杂,但我不确定它增加了什么。

更新:第二种解决方案更好。它可以处理第一个解决方案不能处理的函数参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2016-08-28
    相关资源
    最近更新 更多