使用string调用JavaScript函数名称?

我怎样才能把一个事件连接到我已经定义为一个string的函数名?

我正在使用Prototype.js,虽然这不是Prototype-speficic。

$(inputId).observe('click', formData.fields[x].onclick); 

这会导致JavaScript抱怨我的处理程序不是函数。 我宁愿不使用eval()

如果函数在全局范围内,可以使用窗口对象来获取它:

 var myFunc = window[myFuncName]; 

我已经解决了这个问题,因为我需要这样的function。 这里是我的沙箱代码,没有经过彻底的testing,但可以成为其他人的起点。 请注意,在代码中有一个eval(),因为我无法弄清楚如何绕过这一步,也许是一个JavaScript的怪癖,不能以任何其他方式完成。 让我知道是否有办法摆脱eval()在这里!

 executeFunctionByName = function(functionName) { var args = Array.prototype.slice.call(arguments).splice(1); //debug console.log('args:', args); var namespaces = functionName.split("."); //debug console.log('namespaces:', namespaces); var func = namespaces.pop(); //debug console.log('func:', func); ns = namespaces.join('.'); //debug console.log('namespace:', ns); if(ns == '') { ns = 'window'; } ns = eval(ns); //debug console.log('evaled namespace:', ns); return ns[func].apply(ns, args); } core = { paragraph: { titlebar: { user: "ddd", getUser: function(name) { this.user = name; return this.user; } } } } var testf = function() { alert('dkdkdkd'); } var x = executeFunctionByName('core.paragraph.titlebar.getUser', 'Ikon'); executeFunctionByName('testf'); 

…或者这个[myFuncName];

也许?

 setTimeout ( "myFunc()", 1 ); 

看起来像formData.fields[x].onclick拥有一个全局函数的名字? 如果这样尝试:

 $(inputId).observe('click', window[formData.fields[x].onclick]); 
 window.myFunction === window["myFunction"] 

只要一个eval就能完成这项工作

 var call = eval("method_name").call(args); 

你知道onclick属性包含什么types吗? 我认为这是原型特定的东西,因为“字段”不存在于DOM表单中。

如果您需要使用参数调用string函数,请执行以下操作:

 window[stringFunctionName].apply( window, arrayOfArguments ) 

如果您愿意,您可以使用scope代替window