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

标签 javascript string lambda

我正在尝试编写一个可以将任何内容转换为函数的函数。该函数应按如下方式工作:

  1. 检查它是否已经是一个函数,如果是就返回它。
  2. 检查它是否是一个字符串,如果是,是否有一个具有该名称的全局函数,如果是,则返回它。
  3. 检查字符串是否可以求值,如果可以,则返回一个对字符串求值的 lambda(匿名)函数。
  4. 如果之前所有将值转换为函数的尝试均失败,则返回一个返回该值的 lambda(匿名)函数。这也是我处理所有其他变量类型(数字、空值、未定义、 bool 值、对象和数组)的方式。
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 实际上会计算代码,在某些情况下我不希望代码(在字符串中)运行多次。目前它评估字符串以查看是否有任何错误,如果没有,它将评估的代码(字符串)作为函数返回,然后在以后再次运行。

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

最佳答案

有人发布了一个有效但已删除的答案。所以这里是一个有效的 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 构造函数

关于javascript - 在 JavaScript 中,我可以检查是否可以在不实际评估字符串的情况下评估它吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35063600/

相关文章:

java - 是否有可能(如何)在 Java 运行时获取方法引用的名称?

Javascript 方法定位边距为 : auto 的所有元素

javascript - 如何获取在单个页面中使用/调用的 javascript 方法列表?

javascript - 如何使用 javascript 设置默认复选框状态?

c# - 从 MemberExpression 和 Constant 创建 Func<T, bool>

javascript - 我在使用 Node js 和 AWS Lambda 创建 cookie 时遇到困难

javascript - 如何将javascripts发送到底部? (在 symfony 2 中)

c++ - Turbo C++ 的字符串问题

php - 在字符串末尾查找最长的字典单词

sql - 如何在 SQL Server 2008 中的字符串之间插入字符?