0

SO我知道( 1 , 2 , 3 )上已经有一些类似的问题,但不幸的是,我有限的知识JS不允许我将这些场景外推到我的个人用例中,因此这个问题。

我有以下一段代码,它允许我动态附加到对象并从对象调用一些函数,这些函数工作正常(可在 上找到JsFiddle):

JavaScript

$.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);
}​

HTML:

<button onClick="dynamic_call('real_function','some text');">click me</button>​

更新:

有趣的是,我试图复制我遇到的一个问题,即我的函数在本地范围内,但我最后写了一个不是它的例子:)(我告诉过你JS不是我的事)。因此,所有window[function_name]答案都是正确的,尽管我接受了James Allardice's 因为他推断出我试图解决但没有提出的问题。

如何在不使用的情况下实现相同的功能eval

4

5 回答 5

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];
于 2012-07-13T13:13:33.510 回答
2

eval如果函数在本地范围内,则无法执行此操作。eval如果函数是某个对象的属性,则只能这样做。这包括全局对象,因此可以在没有eval.

使用作为某个对象属性的全局函数或函数:

MyPlugin["dynamicFunction"] = window[function_name];//window references global object
于 2012-07-13T13:13:22.520 回答
1

如果real_function是一个全局函数,你只需调用

window[function_name](text);
于 2012-07-13T13:13:31.873 回答
1

我知道这不是确切的问题,但是如果您可以将函数作为参数传入,如下所示:

<button onClick="dynamic_call(real_function,'some text');">click me</button>​

function dynamic_call(f, text) {
   MyPlugin["dynamicFunction"] = f;
   MyPlugin["dynamicFunction"](text);
}​
于 2012-07-13T13:13:43.927 回答
1

而不是使用evalfunction_namewindow对象引用:

MyPlugin["dynamicFunction"] = window[function_name];
于 2012-07-13T13:13:48.153 回答