我正在尝试编写一个可以将任何内容转换为函数的函数。该函数应按如下方式工作:
- 检查它是否已经是一个函数,如果是就返回它。
- 检查它是否是一个字符串,如果是,是否有一个具有该名称的全局函数,如果是,则返回它。
- 检查字符串是否可以求值,如果可以,则返回一个对字符串求值的 lambda(匿名)函数。
- 如果之前所有将值转换为函数的尝试均失败,则返回一个返回该值的 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/