2010-11-12 52 views
1

我有一個對象創建屬於特定的類。替代eval在Javascript中

  var schCom1 = Server.CreateObject(ArchiveProgID); 

現在,這個對象給出了對動態決定的方法的調用。

  fnName += "("; 
     for (counter=0;counter<fnArgs.length;counter++) 
     { 
      if(counter > 0) 
       fnName += ","; 
      fnName += fnArgs[counter]; 
     } 
     fnName += ")"; 
     writeComment("Ready to call method:" + "schCom1." + fnName); 
     // according to the type of recurrance, call method 
     eval("schCom1."+ fnName); 

是否有任何替代可能對此eval調用?

任何幫助將是有價值的。

在此先感謝。
Tazim。

+2

[在Javascript中使用動態參數調用動態函數](http://stackoverflow.com/questions/676721/calling-dynamic -function-with-dynamic-parameters-in-javascript) – 2010-11-12 08:39:16

+1

你應該使用'fnName + =「(」+ fnArgs.join(「,」)+「)」'而不是'for'循環。 – Ben 2010-11-12 08:45:46

回答

3

只要fnName真的是schCom1對象的方法的名稱:

schCom1[fnName].apply(schCom1,fnArgs); 

基本上,函數對象的apply方法允許您調用函數並提供上下文(父對象)和參數。並且apply方法期望函數參數作爲數組提供,在這種情況下這很有用。

apply方法的文檔瞭解更多信息:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/apply

另外還有call方法,它有類似的功能,但預計函數參數作爲常規參數列表:

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/call

+0

thanx很多。回答對理解概念 – Star123 2010-11-12 08:47:58

+0

真的很有幫助fnName不是schCom1函數名的真實名稱。 fnName = Request(「fnName」)。它應該是schCom1 [Request(「fnName」)]。apply(schCom1,fnArgs); – Star123 2010-11-12 09:23:26

2

您可以使用更簡單的

schCom1[fname].apply(schCom1, fnArgs) 

將取代所有的代碼在那裏

+1

難道你不是指'schCom1 [fnName] .apply'?除此之外,很好的答案:) – Aistina 2010-11-12 08:43:52

+1

@Aistina是的,我做到了,謝謝! (沒有看到那裏的血腥點) – 2010-11-12 08:44:46

+1

'this'在這種情況下可能指向一個全局變量,它確實應該是'schCom1'而不是 – Andris 2010-11-12 08:45:17