2016-05-23 44 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屬性,因爲每次都有不同的動態參數。 –