从字符串名称动态创建JavaScript函数

dev*_*os1 10 javascript class function

给定一个字符串classname,我想动态创建一个以该字符串命名的新JavaScript函数,该函数可用于实例化对象.

我尝试过使用eval()但由于某种原因,声明的函数不会出现在全局(窗口)范围内.

eval( "function " + classname + "() {}" );
window[ classname ]; // => undefined
Run Code Online (Sandbox Code Playgroud)

有没有办法可以动态创建一个以字符串命名的新函数?

或者,或者,通过创建它后,给我一些方法来引用创建的函数eval.有趣的是,当我在Safari中调试它时,它看起来像一个局部变量.

更新:

得到它了!当然很明显,我只是eval再次使用来创建实例:

var myInstance = eval( "new " + classname );
myInstance.constructor.name; // => classname (yay)
Run Code Online (Sandbox Code Playgroud)

这应该适用于我的情况,因为我只需要在声明后立即创建一个类的实例.对于一般情况,虽然看到Pointy的答案.

Poi*_*nty 11

是:

window[classname] = function() { ... };
Run Code Online (Sandbox Code Playgroud)

现在,诚实地说,这与你的尝试不完全相同,但它非常接近.当您通过类似的function 表达式实例化一个函数,并且没有名称时,除了通过外部作用域中的名称(在本例中为全局作用域)之外,该函数不能引用自身.

如果这很重要,你可以做的是:用一些股票"内部"名称创建函数,然后将其分配给全局名称:

function secretName() { ... }

window[classname] = secretName;
Run Code Online (Sandbox Code Playgroud)

  • 是的,我真的很喜欢正确命名的功能. (2认同)

小智 7

function registerFunction(functionBody) {
         "use strict";
         var script = document.createElement("script");
         script.innerHTML = "function " + functionBody;
         document.body.appendChild(script);
}
registerFunction("fooBar(x, y) { return x + y; }");
fooBar(1, 2); // will give you 3
Run Code Online (Sandbox Code Playgroud)

虽然这基本上是相同的,eval()但它将在当前页面的域中注册该函数.您可以稍后删除此脚本元素,或将其重用于其他功能.