你能把一个匿名方法(函数)动态地变成一个命名方法吗
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的链接:如何在Chrome中动态设置Javascript中的函数/对象名称。这种方法还处理函数的参数。
您不能重命名匿名函数的精确实例,但您可以使用闭包重新定义它并更改其名称,如下所示:
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) 如何在Chrome 中显示的Javascript中动态设置函数/对象名称
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;
他们都工作。第二个解决方案比较复杂,但我还不确定它增加了什么。
更新:第二个解决方案是更好的。它可以处理函数的参数,而第一个解决方案没有。
相关文章:
- 将一个方法转换为promise:Nodejs
- 如何在所有ng点击事件AngularJS上启动一个方法
- 创建一个方法,通过一个窗口进行迭代并获取Titanium中的所有控件
- 如何创建一个方法来验证数组的范围
- 如何将一个方法延迟到另一个方法首先完成,javascript
- 在Javascript中对类的每个实例调用一个方法
- 如何重写一个方法,并且仍然能够在重写的方法中使用基方法
- NodeJS-从同一文件中的另一个方法调用一个方法
- 有没有任何情况下,一个方法不应该是原型方法
- Jasmine间谍的函数称为一个方法
- 在带有参数列表的表单submit上调用一个方法
- 方法不在另一个方法内部调用
- 在 1 个方法中增加变量值会触发另一个方法的 for 循环,欢迎任何建议
- 如何使用javascript express node将变量从控制器中的一个方法公开.js到另一个控制器.js
- 如何在javascript中将变量的值分配给另一个方法
- 在浏览器关闭时,单击确认对话框中的“停留在页面上”,执行一个方法
- 使用一个方法在c#中启动其他方法
- 如何在Ember中转换到另一个路由时调用一个方法
- 在typescript中重载一个方法
- 我可以在setInterval函数中放入一个方法作为参数吗