2012-07-13 64 views
0

我知道有几个类似的问题已经在SO123),但不幸的是我有限的知识JS不允许我到场景外推到我的个人用例,因此这个问题。如何动态附加功能的对象

我有下面的代码段,让我动态附加到和呼叫从物体一些功能,这些功能能正常工作(available on 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>​ 

UPDATE:

够滑稽的,我试图复制一个问题,我有我的,其中功能是局部范围,但我最后写一个例子是不:)(我告诉你JS不是我的事情)。因此,所有window[function_name]的答案都是正确的,尽管我接受James Allardice的答案,因为他推断了我试图解决的问题,但没有提出。

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

回答

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]; 
2

如果该函数在本地范围内,则不能在没有eval的情况下执行此操作。如果函数是某个对象的属性,则只能在没有eval的情况下执行。这包括全局对象,所以全局函数可以在没有eval的情况下完成。

有了一个全局函数或函数是某个对象的属性:

MyPlugin["dynamicFunction"] = window[function_name];//window references global object 
1

如果real_function是gloabl功能,你只需要调用在全球范围内

window[function_name](text); 
1

我知道这是不是确切的问题,但如果你能在功能只是作为参数传递,就像这样:

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

function dynamic_call(f, text) { 
    MyPlugin["dynamicFunction"] = f; 
    MyPlugin["dynamicFunction"](text); 
}​ 
+0

这是最好的解决方案。当你可以传递函数时没有理由传递一个字符串。 – jbabey 2012-07-13 13:20:40

+0

无法用我的示例覆盖所有内容:我无法将函数名称作为参数传递,我从某个HTML属性值中获取函数名称。谢谢,但不适用于我的用例。 – Max 2012-07-13 13:24:26

1

而不是使用eval的,从参考 object:

MyPlugin["dynamicFunction"] = window[function_name];