2011-07-28 42 views
1

有沒有一種更好的方式來執行字符串「getData」沒有eval或評估在這種情況下一個好的選擇,因爲什麼被評估不是用戶生成?執行一個沒有eval的字符串或是eval可以在這裏使用?

object.myMainObject(Marcus) 

object = { 
    Data = { 
     Marcus : function(){ 
      alert('marcus function') 
     }, 
     James : function(){ 
      alert('james function') 
     } 
    } 

    myMainObject : function(string){ 
     getData = "object.Data." + string + "()" 

     eval(getData) 
    } 
} 
+2

是。我們每週至少得到一次這個問題。我不知道所有的JavaScript初學者有些來自哪裏,以及爲什麼他們沒有像對象<->哈希映射早期那樣重要的基礎知識... – delnan

回答

4

eval對於這種情況完全不必要,只需使用括號符號訪問動態命名屬性:

var object = { 
    Data : { 
     Marcus : function(){ 
      alert('marcus function'); 
     }, 
     James : function(){ 
      alert('james function'); 
     } 
    } 

    myMainObject : function(string){ 
     var getData = object.Data[string](); 
    } 
}; 

object.myMainObject("Marcus"); // 'marcus function' 

注:

  • 療法e在您定義object(您使用的是=,而不是:)的方式中出現了一些語法錯誤。
  • 您在聲明變量時請不要使用var聲明objectgetData,否則使用var聲明,否則它們將最終作爲全局對象的屬性。
  • 爲安全起見,你可以檢查,如果這是被訪問的成員實際上是一個函數調用它之前,例如:

    //... 
    var getData; 
    if (typeof object.Data[string] == 'function') { 
        getData = object.Data[string](); 
    } 
    //... 
    
-1

可以評估它。雖然我真的不明白你想達到什麼目的。

+0

這是不好的評估它(編輯:不是我downvote雖然)。認爲'string ==「x; alert('har har')//」'。特別是因爲有一種無需評估的方式,效果更好,而且實際上更容易打字和閱讀。 – delnan

+0

看來他想通過傳入一個函數名稱的字符串來運行函數。 :P – Trevor

+0

是的,我完全不明白髮生了什麼事情。不過,我會把我的答案留給別人的警告! –

2

評估它是不好的。

getData = object.Data[string]()

相關問題