代码之家  ›  专栏  ›  技术社区  ›  Doc_failure

在节点服务器中使用eval是一个坏主意吗?

  •  0
  • Doc_failure  · 技术社区  · 8 年前

    var a1 = require(./a1.js),
        a2 = require(./a2.js),
        ...
        aN = require(./aN.js);
    
        function createObj(pObjName, pObjValue){
            var tmp = new eval(pObjName)(pObjValue);
            //where pObjName is a1 or a1 or .... or aN
        }
    
    3 回复  |  直到 8 年前
        1
  •  3
  •   robertklep    8 年前

    从你展示的内容来看,没有必要使用 eval :

    const Classes = {
      a1 : require('./a1'),
      a2 : require('./a2'),
      ...
    };
    
    function createObj(pObjName, pObjValue){
      var tmp = new Classes[pObjName](pObjValue);
      ...
    }
    
        2
  •  1
  •   Gekkie    8 年前

    你可能想看看 Object.create()-method

        3
  •  0
  •   Patrick Roberts Benjamin Gruenbaum    8 年前

    如果您想节省声明所有这些依赖项的时间,甚至可以不使用 eval 这样可以更有效地处理案件:

    function createObj(pObjName, pObjValue) {
      var tmp = new (require('./' + pObjName))(pObjValue);
      // ...
    }
    

    请注意,只有在以下情况下,这才是安全的 createObj() 保证使用 pObjName

    function createObj(pObjName, pObjValue) {
      if (!/^a\d$/.test(pObjName)) {
        throw new TypeError('invalid name')
      }
    
      var tmp = new (require('./' + pObjName))(pObjValue);
      // ...
    }