如何将函数动态附加到对象

时间:2012-07-13 13:09:42

标签: javascript function object dynamic

我知道SO123已经存在一些类似的问题,但遗憾的是我对{{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的情况下实现相同的功能?

5 个答案:

答案 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];