你能把一个匿名方法(函数)动态地变成一个命名方法吗?
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。此外,这是在节点服务器应用程序中,因此跨浏览器问题无关紧要。
编辑: 对我有用的答案是丹尼尔的 link:How to dynamically set a function/object name in Javascript as it is displayed in 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) 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;
它们都有效。第二种解决方案更复杂,但我不确定它添加了什么。
更新:第二种解决方案更好。它可以处理第一个解决方案不能处理的函数参数。
鉴于此方法:
var obj = {}, obj.foo = function () {};
是否可以在方法创建后为其分配一个名称,使其看起来类似于:
var obj = {}, obj.bar = function bar() {};
foo 方法是匿名的并分配给 属性。 bar 方法被命名并分配给 属性.
你能把匿名的 foo 方法动态地变成命名的 foo 方法吗?函数对象上是否有可以设置的 属性 或类似的东西:
obj.foo.<name> = Object.keys(obj)[0];
请不要使用 jquery。此外,这是在节点服务器应用程序中,因此跨浏览器问题无关紧要。
编辑: 对我有用的答案是丹尼尔的 link:How to dynamically set a function/object name in Javascript as it is displayed in 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) 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;
它们都有效。第二种解决方案更复杂,但我不确定它添加了什么。
更新:第二种解决方案更好。它可以处理第一个解决方案不能处理的函数参数。