功能Typecasting JavaScript

时间:2016-05-23 10:05:50

标签: javascript jquery javascript-objects

最近我问了一个问题

Extract & call JavaScript function defined in the onclick HTML attribute of an element(using jQuery attr/prop)

我需要以编程方式访问按钮的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);

感谢。

2 个答案:

答案 0 :(得分:1)

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());

如果你展示了更多的代码,我们可以提出建议,但关键是当调用Function构造函数时,代码不会立即运行,它会返回对新创建的函数的引用。

此外,您似乎明白可以自己调用此功能。这样做有什么问题?

答案 1 :(得分:0)

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

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

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

Javascript use variable as object name

评论

相关问题