javascript:创建命名函数,但其名称存储在一个变量中
javascript: create named function but its name is stored in a variable
在应用程序中的某个时刻,我需要构造函数的名称
instance.constructor.name
但是,当我创建构造函数时,它的名称存储在一个变量中。所以,让你知道我想要什么
var nameOfTheFunction = "Test" ;
var BarFoo = function() { /* do stuff */ } ;
BarFoo.name = nameOfTheFunction ;
这当然不起作用,因为name属性是只读的。
那么,是否可以动态创建一个构造函数,最终结果是它创建的实例将具有
instance.constructor.name === nameOfTheFunction
更新:请查看下面的评论,因为它符合我的要求。不过,对于这些问题,多亏了答案,我最初是在寻找这个
(new Function( 'base', 'return function ' + Foo.name + '(){ base.apply(this, arguments); };'))(Foo) ;
这个解决方案的问题是,这里创建的东西不是Foo的实例,除非你做了这样的事情,这让我在下面的评论中找到了解决方案!
我不认为eval
是个坏主意。但我建议您使用工厂函数,这样您就不必用字符串文字来编写函数的所有代码:
function createNamedFunction(name, func) {
eval("var f = function " + name + "(){return func.apply(this, arguments);};");
return f;
}
var t = createNamedFunction("myFunc", function () {
console.log("hello");
});
console.log(t.name); //myFunc
t(); //hello
FIDDLE
编辑
您也可以直接操作函数的字符串表示,因此不必使用apply
方法:
function createNamedFunction(name, func) {
var fstr = func.toString(),
index = fstr.indexOf("(");
fstr = "function " + name + fstr.substring(index);
eval("var f = " + fstr + ";");
return f;
}
如果您在浏览器端,可以使用以下解决方案:
Javascript:动态函数名
当然,这会使你的函数成为一个全局变量。
编辑:如果你绝对想使用eval
,你可以使用以下结构:
function generateFunction(functionName) {
function __REPLACE__() {
// your function's code
}
eval(__REPLACE__.toString().replace('__REPLACE__', functionName));
return functionName;
}
在您的情况下,我认为我们可以使用eval
var nameOfTheFunction = "Test" ;
var BarFoo = eval("function " + nameOfTheFunction + "() { /* do stuff */ }") ;
相关文章:
- 将jsp文件下拉列表中的选定项分配给一个java变量(比如String selection)
- 导航到特定事件的另一个变量页面
- 在另一个函数中使用变量this
- 我可以在Javascript/jQuery中使用一个变量作为键吗
- 使用mongodb更新中的一个变量
- 为什么window.open不打开一个以变量形式给出的链接
- 将节点数据分配给另一个变量jstree
- 如何将变量传递到另一个js文件
- 我怎么能让流星简单模式中的一个字段等于一个js变量,并且仍然让用户填写简单模式的其余部分
- 如何从onclick函数设置全局变量并将其传递给另一个JS文件
- 将会话变量从一个页面传递到另一个页面
- Javascript:在激发函数后返回一个变量以供使用
- 替换另一个变量对象中的变量值
- 什么'它的意思是当一个变量位于括号外时
- 这在JavaScript中是一个好的变量名吗
- 可以't将sessionStorage设置为Javascript中的一个变量
- 如何在javascript中给变量一个随机值
- 在不同的.js文件之间传递变量;一个是在iframe内
- Console.log(变量);VS console.log([变量]);/一个提供信息,另一个没有
- 是否可以给变量一个默认值