最近我问了一个问题
我需要以编程方式访问按钮的onclick attrib,该按钮具有函数调用以及其中的param,然后提供额外的参数&进行函数调用(onclick=doSomething(2,4)
)。
但是当我发现apply/call
的使用也可以方便地提供额外的参数。为此,我从属性&中提取了函数名称。它有一个像
arr[1] = 'doSomething';
我尝试使用函数构造函数将其视为一个函数,但它不起作用
(比如Function(arr[1])
)为什么?
提到的解决方案Javascript: interpret string as object reference?运行正常。但为什么它不能通过函数构造函数实现?
一些代码信息
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);
感谢。
答案 0 :(得分:1)
new Function
和eval
不可互换。当您评估时,您正在创建立即运行的代码。当你创建一个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());
如果你展示了更多的代码,我们可以提出建议,但关键是当调用Function构造函数时,代码不会立即运行,它会返回对新创建的函数的引用。
此外,您似乎明白可以自己调用此功能。这样做有什么问题?
答案 1 :(得分:0)
我在JavaScript聊天室讨论了这个问题,我从中了解到new Function(..)
构造函数需要整个函数体以我期望的方式返回引用。
函数构造函数不考虑doSomething
在脚本中写入的eval
函数的定义。
这种情况下适合的其他方式如下:
Javascript use variable as object name
评论