JavaScript - 使用可变名称创建函数

3
我试图基于变量名称创建一些函数,类似于:
var functionsToRegister = ["foo","bar"];

var index;
for (index = 0; index < functionsToRegister.length; ++index) {
    var function_name = functionsToRegister[index];

    PART_IM_MISSING = new Function('return alert("hello, world!");');
}
客户端代码调用特定的方法,例如它将调用foo()。 请注意,我不是在开发网站,而是在本地Windows应用程序(SoftOne)中使用JavaScript引擎提供一些自定义选项。 此外,绝对无法更改客户端代码调用这些函数的方式。

1
使用对象/数组不行吗?functions [function_name] - evolutionxbox
生成一个具有相应键的对象? - user5653854
@evolutionxbox @LPK 是否允许客户端代码直接运行 foo() 还是需要调用函数 functions["foo"]?只有前者才能正常工作。 - anpel
客户端代码需要运行 functions.foo() - evolutionxbox
@evolutionxbox,在这种情况下,这是绝对不可能的。 - anpel
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
8
您可以使用window对象来创建全局函数。

var functionsToRegister = ["foo", "bar"],
    index,
    function_name;

for (index = 0; index < functionsToRegister.length; ++index) {
    function_name = functionsToRegister[index];
    window[function_name] = new Function('return alert("hello, world!");');
}

foo();


谢谢您的快速回复。不幸的是,在测试后我发现窗口对象未定义。有没有什么方法可以解决这个问题? - anpel
请添加平台。 - Nina Scholz
@anpel - "window object is not defined"?你在哪个平台上运行?我想不是浏览器吧。 - evolutionxbox
@evolutionxbox 确实。正如我在问题中提到的那样,它是一个Windows应用程序。 - anpel

2
var functionsToRegister = ["foo","bar"];

var index;
for (index = 0; index < functionsToRegister.length; ++index) {
    var function_name = functionsToRegister[index];

    this[function_name]=function() {
        return alert("hello, world!");
    }
}
这将为此对象(或您可以使用任何对象,如window)添加函数foo和bar,但我猜您不想要n个相同的函数.. 所以也许应该这样做:

var functionsToRegister = {
    'foo':function() {return alert("hello, foo!");},
    "bar":function() {return alert("hello, bar!");},
};


var index;
for (index in functionsToRegister) if(functionsToRegister.hasOwnProperty(index)) {
    var function_name = index;
    var function_code = functionsToRegister[index];


    this[function_name]=function_code;
}


this['foo']();
this.bar();

foo();


1
@evolutionxbox 当然可以!更新片段。 - FrancescoMM
1
@evolutionxbox 如果您在浏览器中使用 window,那么 foo() 也可以工作。 - FrancescoMM
1
@FrancescoMM 感谢您的时间。不幸的是,在这个问题的背景下,客户端只能调用 foo(),因此这种方法在这里行不通。 - anpel
1
@FrancescoMM 如果我在一个普通的浏览器窗口中,我会是一个快乐的人。不幸的是,正如问题中所提到的,“我不是在开发网站,而是在一个允许通过JavaScript引擎进行自定义选项的本地Windows应用程序上工作。” - anpel
1
@FrancescoMM this 最终成为了解决方法。窗口对象确实不可用。感谢您的时间。 - anpel
显示剩余3条评论

0

你可以使用 eval 函数。

eval('var '+name+'=function(){alert("hello");};');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,