Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/91.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用eval的替代方案?_Javascript - Fatal编程技术网

Javascript 使用eval的替代方案?

Javascript 使用eval的替代方案?,javascript,Javascript,我目前正在编写一个API,允许用户通过loadModules()函数加载模块(提供一种插件功能): 完整代码: var LC = (function(){ var alertModule = { alertName: function(name) { alert(name); }, alertDate: function() { alert(new Date().toUTCString(

我目前正在编写一个API,允许用户通过loadModules()函数加载模块(提供一种插件功能):

完整代码:

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']);
在loadModules方法中,我循环遍历数组,并使用以下代码将对象添加到LC:

this[moduleList[i]] = eval(moduleList[i]);
这可以很好地工作,而且我相当确定它是安全的(如果模块不存在,就会抛出错误),但是有没有更优雅的方法来实现这一点?我认为实现这一点的唯一其他方法是将模块本身放在一个对象中,这样我就可以更容易地引用它们。欢迎有任何其他想法/想法

试试这个:

与使用
eval()
引用那些“私有”变量不同,您可以使用模块散列

var modules = {
  alertModule: { .. },
  logModule: { ... },
}
您可以在此基础上进行扩展,并添加额外的功能,如使用另一个公共方法动态注册模块,例如
addModule

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

始终在问题本身中发布所有相关代码,而不仅仅是链接。(即使是JSFIDLE——FIDLE是一个不错的添加,而不是替代品。)检查以下内容:抱歉,代码添加正确……而且似乎apply()是正确的选择,谢谢Amrendra!谢谢你的想法,我现在只是在尝试不同的方法,所以我一定会接受这个想法。
return {
  addModule: function(name, newModule) {
    modules[name] = newModule;
  },
  loadModules: function() { ... } 
}