2016-05-23 39 views
2

最近,我曾问一个问题功能类型转换的JavaScript

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

我需要以编程方式访问一个按钮,曾与PARAM的沿函数调用的onclick ATTRIB它然后提供一个额外的PARAM &使函数调用(onclick=doSomething(2,4))。

但是当我弄清楚,使用apply/call也可以来得心应手地提供额外param's.For这个我从它有一个字符串像

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

'new Function'构造函数的工作方式与'eval()'类似。所以'new Function(arr [1] +“()”);'可能会工作。 –

+1

做一个小提琴.... – Rayon

+0

@NiettheDarkAbsol如何传递额外的参数呢? –

回答

0

我在JavaScript聊天室中讨论过这个问题,我从中明白了构造函数需要整个函数体来以我期待的方式返回引用。

功能构造函数不考虑在脚本中编写的doSomething函数的定义,而eval执行此操作。

可能被适合在这个场景中的其他方式在这里:

Javascript use variable as object name

评论?

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

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

此外,你似乎明白,你可以自己调用函数。这样做有什么问题?

+0

是的,我没想到它会立即运行,但我期望'var funcName'获得函数'doSomething'的引用,该函数的名字是从arrArgs [1] .slice(0,arrArgs [1] .indexOf('('))this doSomething'对函数的调用是'funcName.apply('',funcArgs);'在这种情况下不会被调用,除非我做'var funcName = eval(arrArgs [1] .slice(0,arrArgs [1] .indexOf('(')));' –

+0

看起来像'var funcName = new Function(arrArgs [1] .slice(0,arrArgs [1] .indexOf('(')));'尽管名称正确,即不是引用函数,例如'arrArgs [1] .slice(0,arrArgs [1] .indexOf('('))中的'doSomething' ' –

+0

我必须提取onclick属性,因为每次都有不同的动态参数。 –