2013-03-15 142 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