functionTypecasting JavaScript

最近我问过一个问题

提取并调用元素的onclick HTML属性中定义的JavaScript函数(使用jQuery attr / prop)

我需要以编程方式访问按钮的onclick attrib,该按钮具有函数调用以及其中的param,然后提供额外的参数并进行函数调用( onclick=doSomething(2,4) )。

但是当我发现使用apply/call也可以方便地提供额外的param。为此我从属性中提取了函数名称并且它出现在一个字符串中

 arr[1] = 'doSomething'; 

我尝试使用函数构造函数将其视为一个函数,但它不起作用(如Function(arr[1]) )为什么?

解决方案提到Javascript:将字符串解释为对象引用? 工作良好。 但为什么它不能通过函数构造函数实现?

一些代码信息

  var funDef ='doSomething'; // this is the name of real function defined in the script var funcName = new Function(funDef); //expected it to return reference of function doSomething,shows function anonymous() in console var funcArgs = [5,7,10]; funcName.apply('',funcArgs); //this is the function call. 

在这种情况下,函数不会被调用,直到我替换

  var funcName = new Function(funDef); with var funcName = eval(funDef); 

谢谢。

new Functioneval不可互换。 当您评估时,您正在创建立即运行的代码。 当您创建一个Function ,它将返回一个您可以自己运行的函数。

这几乎就像你做的那样:

 // This executes 1+2 var resultOfEval = eval('1+2'); // This creates a function that when called, returns 1+2 var resultOfWrappedEval = eval( '(function(){return 1+ 2})' ); // This is much like the line above, you have to call it for it to execute var resultOfFunctionCtor = new Function('return 1+ 2;'); console.log('resultOfEval', resultOfEval); console.log('resultOfWrappedEval', resultOfWrappedEval); console.log('executing resultOfWrappedEval', resultOfWrappedEval()); console.log('resultOfFunctionCtor', resultOfFunctionCtor); console.log('executing resultOfWrappedEval', resultOfFunctionCtor()); 

我在JavaScript聊天室讨论了这个,我从中了解到new Function(..)构造函数需要整个函数体以我期望的方式返回引用。

函数构造函数不考虑eval在脚本中编写的doSomething函数的定义。

其他适合这种情况的方法如下:

Javascript使用变量作为对象名称

评论?