我知道SO
(1,2,3已经存在一些类似的问题,但遗憾的是我对{{1}的了解有限}不允许我将场景推断到我的个人用例,因此这个问题。
我有以下代码片段允许我动态地附加到对象并从对象调用一些函数,这些函数运行正常(available on JsFiddle
):
的JavaScript :
JS
HTML:
$.extend(true, window, {
"MyPlugin": {
"dynamicFunction": dummy_function
}
});
function dummy_function() {
}
function real_function(string) {
alert(string);
}
function dynamic_call(function_name, text) {
MyPlugin["dynamicFunction"] = eval(function_name);
MyPlugin["dynamicFunction"](text);
}
更新
有趣的是,我试图复制一个问题,我的函数在本地范围内,但我结束了一个例子,它不是:)(我告诉你<button onClick="dynamic_call('real_function','some text');">click me</button>
不是我的事) 。因此,所有JS
答案都是正确的,尽管我接受了window[function_name]
,因为他推断我试图解决但未提出的问题。
如何在不使用James Allardice
的情况下实现相同的功能?
答案 0 :(得分:3)
全局范围内的函数声明成为window
的属性,因此您可以使用方括号语法:
function dynamic_call(function_name, text) {
MyPlugin["dynamicFunction"] = window[function_name];
MyPlugin["dynamicFunction"](text);
}
如果您的函数不在全局范围内,则可以将其设置为某个对象的属性值:
var myFuncs = {
real_function: function () {
alert(string);
}
};
然后你可以简单地使用:
MyPlugin["dynamicFunction"] = myFuncs[function_name];
答案 1 :(得分:2)
如果函数在本地作用域,则不能在没有eval
的情况下执行此操作。如果函数是某个对象的属性,则只能在没有eval
的情况下执行此操作。这包括全局对象,因此可以在没有eval
的情况下完成全局函数。
使用属于某个对象属性的全局函数或函数:
MyPlugin["dynamicFunction"] = window[function_name];//window references global object
答案 2 :(得分:1)
如果real_function
是全局函数,则只需调用
window[function_name](text);
答案 3 :(得分:1)
我知道这不是确切的问题,但是如果你可以将函数作为参数传递,就像这样:
<button onClick="dynamic_call(real_function,'some text');">click me</button>
function dynamic_call(f, text) {
MyPlugin["dynamicFunction"] = f;
MyPlugin["dynamicFunction"](text);
}
答案 4 :(得分:1)
不使用eval
,而是从function_name
对象引用window
:
MyPlugin["dynamicFunction"] = window[function_name];