2013-03-15 113 views
0

我目前正在寫一個API,允許用戶通過loadModules()函數加載模塊(以給人一種插件功能):替代使用eval?

代碼全:

var LC = (function(){ 

    var alertModule = { 

     alertName: function(name) { 
      alert(name); 
     }, 

     alertDate: function() { 
      alert(new Date().toUTCString()); 
     } 

    } 

    var logModule = { 

     logName: function(name) { 
      console.log(name); 
     }, 

     logDate: function() { 
      console.log(new Date().toUTCString()); 
     } 

    } 

    return { 

     loadModules: function(moduleList) { 

      for(var i=0, l=moduleList.length; i<l; i++) { 

       try { 
        this[moduleList[i]] = eval(moduleList[i]); 
       } catch(e) { 
        throw("Module does not exist"); 
       } 

      } 

     } 

    } 

})(); 

LC.loadModules(['alertModules', 'logModule']); 

下面的代碼會將alertModule和logModule對象添加到LC對象。

LC.loadModules(['alertModule', 'logModule']); 

裏面的loadModules方法,我循環遍歷數組並使用下面的代碼將對象添加到LC:

this[moduleList[i]] = eval(moduleList[i]); 

這工作得很好,我相當肯定它是安全(如果該模塊不存在,則會引發錯誤),但有沒有更好的方法來做到這一點?我能想到的唯一方法就是將模塊本身放在一個對象中,這樣我就可以更容易地引用它們。任何其他想法/想法都會受到歡迎!

+1

始終都張貼在問題本身***相關的代碼***的,不只是鏈接。 (即使它是jsFiddle - 小提琴是一個不錯的*補充*,而不是替代品。)http://meta.stackexchange.com/questions/118392/add-stack-overfow-faq-entry-or-similar- for-putting-code-in-the-question – 2013-03-15 10:45:03

+1

檢查此:http://stackoverflow.com/questions/4162827/alternative-to-eval-in-javascript – Amrendra 2013-03-15 10:47:42

+0

道歉,代碼添加正確... – thesonglessbird 2013-03-15 10:52:54

回答

1

試試這個:http://jsfiddle.net/PUgM7/2/

而不是引用那些「私有」變量與eval()你可以有模塊的散列。

var modules = { 
    alertModule: { .. }, 
    logModule: { ... }, 
} 

你可以擴大這一點,並添加額外的功能,例如與其他公共方法動態註冊模塊,說addModule

return { 
    addModule: function(name, newModule) { 
    modules[name] = newModule; 
    }, 
    loadModules: function() { ... } 
} 
+0

感謝您的想法,我目前只是嘗試不同的方法,所以我一定會把這個在船上。 – thesonglessbird 2013-03-15 11:04:33