在JavaScript中,我可以查看是否可以在不实际评估字符串的情况下评估字符串吗?

时间:2016-01-28 14:01:29

标签: javascript string lambda

我正在尝试编写一个将任何东西转换为函数的函数。该功能应如下工作:

  1. 检查它是否已经是一个函数,如果是,只返回它。
  2. 检查它是否是一个字符串,如果是,那么是否有一个具有该名称的全局函数,如果是,则返回该字符串。
  3. 检查是否可以评估字符串,如果是,则返回一个评估字符串的lambda(匿名)函数。
  4. 如果之前所有将值转换为函数的尝试都失败,则返回一个返回值的lambda(匿名)函数。这也是我处理所有其他变量类型(数字,空,未定义,布尔,对象和数组)的方式。
  5. function canEval(str){
      try { eval(str); } catch (e){ return false; }
      return true;
    }
    function toFunc(v){
      if(typeof(v) == "function") return v;
      if(typeof(v) == "string"){
        if(
          window[v] != undefined &&
          typeof(window[v]) == "function"
        ) return window[v];
        if(canEval(v))
          return function(){eval(v)};
      }
      return function(){return v;};
    };
    

    此代码的问题是canEval实际上评估了代码,在某些情况下我不希望代码(在字符串中)运行多次。目前它评估字符串以查看是否存在任何错误,如果不是,则将评估的代码(字符串)作为函数返回,然后在以后再次运行。

    有没有什么方法可以测试代码是否可以在没有实际运行代码的情况下评估代码(没有错误)?或者将其隔离,以便在评估的代码(字符串)中发生的事情不会对当前文件产生任何影响?

1 个答案:

答案 0 :(得分:1)

有人发布了一个有效但已将其删除的答案。所以这是一个有效的toFunc,如上所述。

function toFunc(v){
    if(typeof(v) == "function") return v;
    if(typeof(v) == "string"){
      if(
        window[v] != undefined &&
        typeof(window[v]) == "function"
      ) return window[v];
      try {
        return new Function(v);
      }catch(e){}
    }
    return function(){return v;};
  };

答案是在try-catch语句中使用Function构造函数